/ / 'उपयोगकर्ता परिभाषित तालिका प्रकार' (एएसपीनेट एसक्यूएल-सर्वर) का उपयोग करके एकाधिक प्रविष्टियां - एएसपीनेट, एसक्यूएल-सर्वर, संग्रहित प्रक्रियाएं, आंतरिक-शामिल, एसक्यूएल-डालने

'उपयोगकर्ता परिभाषित तालिका प्रकार' (एएसपीनेट एसक्यूएल-सर्वर) - एएसपीनेट, एसक्यूएल-सर्वर, संग्रहित प्रक्रियाओं, आंतरिक-शामिल, एसक्यूएल-डालने का उपयोग करके एकाधिक प्रविष्टियां

मेरे एएसपी.नेट वेब ऐप में मेरे पास है DataTable सम्मिलित करने के लिए डेटा से भरा tblChildren.
डेटाटेबल को पास किया जाता है stored procedure.
एसपी में मुझे प्रत्येक पंक्ति को पढ़ने की जरूरत है (ई.आई. लूप डेटाटेबल के माध्यम से), इसमें कुछ कॉलम बदलें (प्रासंगिक डेटा के अनुसार tblParents) और केवल तभी tblChildren में पंक्ति डालें।

SqlBulkCopy नहीं करेंगे और मैं नहीं सोचूंगा TVP या तो करेंगे (यकीन नहीं है ... अभी तक इसके बारे में बहुत परिचित नहीं है)।
निस्संदेह मैं ऐप में डेटाटेबल पंक्तियों के माध्यम से पुन: प्रयास कर सकता हूं और एसपी को अलग से भेज सकता हूं, लेकिन इसका मतलब एसक्यूएल सर्वर पर सैकड़ों राउंड ट्रिप होगा।

मैं दो संभावनाओं में आया जो इसे प्राप्त कर सकते हैं: (1) टेम्प टेबल (2) कर्सर।
पहला काफी गन्दा है और दूसरा, जैसा कि मैं इसे समझता हूं, अनुशंसित नहीं है)

किसी भी मार्गदर्शन की सराहना की जाएगी।

संपादित करें:
मैंने दृष्टिकोण की कोशिश की उपयोगकर्ता परिभाषित तालिका प्रकार.
यहां छवि विवरण दर्ज करें

यह काम करता है क्योंकि मैं तालिका प्रकार (TT_Children) को मानों के साथ पॉप्युलेट करता हूं TT_Child_Family_Id स्तंभ।
वास्तविक जीवन में, हालांकि, मैं इन मूल्यों को नहीं जानूंगा और मुझे इसके माध्यम से लूप की आवश्यकता होगी @my_TT_Children और प्रत्येक पंक्ति के लिए tblFamilies से मान प्राप्त करें, इस तरह कुछ:

SELECT Family_Id FROM tblFamilies WHERE Family_Name = TT_Child_Last_Name

(मान लीजिए कि tblFamilies.Family_Name में TT_Child_Last_Name के लिए हमेशा समकक्ष है)

तो मेरा सवाल है - टेबल-प्रकार के माध्यम से लूप कैसे करें और प्रत्येक पंक्ति के लिए एक अलग तालिका में एक मान देखें?

संपादित करें 2 (समाधान):
अमीर के सही उत्तर में, संग्रहीत प्रक्रिया इस तरह दिखनी चाहिए:

ALTER PROCEDURE [dbo].[usp_Z_Insert_Children]
@my_TT_Children TT_Children READONLY
AS
BEGIN
INSERT INTO tblChildren(Child_FirstName,
Child_LastName,
Child_Family_ID)
SELECT Cld.tt_child_FirstName,
Cld.tt_child_LastNAme,
Fml.Family_Id FROM @my_TT_Children Cld
INNER JOIN tblFamilies fml
ON Cld.TT_Child_LastName = Fml.Family_Name
END

अमीर द्वारा नोट्स: कॉलम परिवार_नाम tblFamily में अद्वितीय और अधिमानतः अनुक्रमित होना चाहिए।
(मैंने यह भी देखा कि TT_Child_LastName के मामले मेंtblFamilies में कोई मिलान नहीं है, पंक्ति डाली नहीं जाएगी और मुझे इसके बारे में कभी पता नहीं चलेगा। इसका मतलब है कि अगर किसी भी पंक्ति को सफलतापूर्वक संसाधित किया गया तो मुझे किसी भी तरह की जांच करनी होगी)।

उत्तर:

उत्तर № 1 के लिए 1

आप tblFamilies में सम्मिलित करने में शामिल हो सकते हैंप्रक्रिया और वहां से मूल्य ले लो। लूपिंग से ज्यादा कुशल। या एक कर्सर बनाएं और एक समय में एक बच्चा करें। 1) सुनिश्चित करें कि tblFamilies में FamilyName का केवल एक ही मौका है। 2) सुनिश्चित करें कि यदि tblFamilies एक बड़ी तालिका है, तो FamilyName कॉलम अनुक्रमित है।

INSERT INTO tblChildren(Child_FirstName, Child_LastName, Child_Family_ID)
SELECT Cld.tt_child_FirstName,
Cld.tt_child_LastNAme,
Fml.FamilyID
FROM @my_TT_Children Cld
INNER JOIN tblFamilies fml on Cld.TT_Child_LastName = Fml.FamilyName

लेकिन ध्यान रखें कि यदि tblFamilies में परिवार_नाम के प्रति एक से अधिक प्रविष्टियां हैं, तो यह डेटा को डुप्लिकेट करेगा। इस मामले में आपको कहां में अधिक प्रतिबंध जोड़ने की आवश्यकता होगी।