2013-06-01 5 views
32

में चयन क्वेरी में INSERT में किसी फ़ील्ड में एक वृद्धिशील संख्या जोड़ें मेरे पास INSERT INTO SELECT क्वेरी है। SELECT कथन में मेरे पास एक सबक्वायरी है जिसमें मैं एक फ़ील्ड में वृद्धिशील संख्या जोड़ना चाहता हूं। यह प्रश्न ठीक काम करेगा यदि मेरी SELECT क्वेरी और केवल एक रिकॉर्ड लौटाता है, लेकिन यदि यह कई पंक्तियों को देता है तो यह उन सभी पंक्तियों के लिए वृद्धिशील फ़ील्ड में समान संख्या को सम्मिलित करता है। क्या हर बार एक वृद्धिशील संख्या जोड़ने के लिए इसे प्रतिबंधित करने का कोई तरीका है?SQL सर्वर

INSERT INTO PM_Ingrediants_Arrangements_Temp 
(AdminID,ArrangementID,IngrediantID,Sequence) 
(SELECT 
    @AdminID, @ArrangementID, PM_Ingrediants.ID, 
    (SELECT 
      MAX(ISNULL(sequence,0)) + 1 
     FROM 
      PM_Ingrediants_Arrangements_Temp 
     WHERE 
      [email protected]) 
FROM 
    PM_Ingrediants 
WHERE 
    PM_Ingrediants.ID IN (SELECT 
           ID 
          FROM 
           GetIDsTableFromIDsList(@IngrediantsIDs)) 
) 

उत्तर

54

आप इसके लिए row_number() फ़ंक्शन का उपयोग कर सकते हैं।

INSERT INTO PM_Ingrediants_Arrangements_Temp(AdminID, ArrangementID, IngrediantID, Sequence) 
    SELECT @AdminID, @ArrangementID, PM_Ingrediants.ID, 
      row_number() over (order by (select NULL)) 
    FROM PM_Ingrediants 
    WHERE PM_Ingrediants.ID IN (SELECT ID FROM GetIDsTableFromIDsList(@IngrediantsIDs) 
          ) 

आप पहले से ही फिर तालिका में अधिकतम के साथ शुरू करना चाहते हैं करते हैं:

INSERT INTO PM_Ingrediants_Arrangements_Temp(AdminID, ArrangementID, IngrediantID, Sequence) 
    SELECT @AdminID, @ArrangementID, PM_Ingrediants.ID, 
      coalesce(const.maxs, 0) + row_number() over (order by (select NULL)) 
    FROM PM_Ingrediants cross join 
     (select max(sequence) as maxs from PM_Ingrediants_Arrangement_Temp) const 
    WHERE PM_Ingrediants.ID IN (SELECT ID FROM GetIDsTableFromIDsList(@IngrediantsIDs) 
          ) 

अंत में, तुम सिर्फ एक स्वत: incrementing पहचान स्तंभ sequence स्तंभ बना सकते हैं। यह प्रत्येक बार इसे बढ़ाने की आवश्यकता को बचाता है:

create table PM_Ingrediants_Arrangement_Temp (. . . 
    sequence int identity(1, 1) -- and might consider making this a primary key too 
    . . . 
) 
+0

तीसरे विकल्प के लिए मुझे अनुक्रम फ़ील्ड ऑटो वृद्धि नहीं करना है। मुझे अनुक्रम से मौजूदा संख्या प्राप्त करने की आवश्यकता है और उस कॉलम –

+0

स्कैनरियो 2 में मेरी वृद्धि में अगले incremental संख्या डालने की आवश्यकता है। तत्काल सहायता के लिए बहुत बहुत धन्यवाद। –

+0

:: यदि मेरा वर्ग कॉलम शून्य मानों की अनुमति नहीं देता है और मेरी तालिका में पहले से कोई रिकॉर्ड नहीं है। इसके फेंकने का अपवाद .... –