कर्सर - एसक्यूएल, एसक्यूएल-सर्वर, कर्सर का उपयोग कर डेटा को दो बार एक ही टेबल में डालें

मेरे पास दो टेबल हैं cursor_created तथा cursor_copied एक ही कॉलम के साथ। मैं डेटा लाने के लिए चाहता हूँ cursor_created और इसे अंदर डालें cursor_copied एक लूप का उपयोग कर दो बार।

प्रश्न:

DECLARE @ID INT
DECLARE @Name NVARCHAR(50)
DECLARE @Amount DECIMAL(18,0)
DECLARE @Date NVARCHAR(50)

DECLARE IDs CURSOR FOR
SELECT
ID, Name, Amount, Date
FROM
cursor_created

OPEN IDs

FETCH NEXT FROM IDs into @ID, @Name, @Amount, @Date

WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO cursor_copied (id, name, amount, date)
VALUES (@ID, @Name, @Amount, @Date)
----Verify that Data in TestTable
--print @ID
--print @Name
--print @Amount
--print @Date

--SELECT @ID, @Name, @Amount, @Date FROM cursor_copied
FETCH NEXT FROM IDs into @ID, @Name, @Amount, @Date
END

CLOSE IDs
DEALLOCATE IDs

आउटपुट:

ID  Name  Amount  Date
------------------------------------------
1   A     2000    2008-03-15 18:15:43.000
2   B     3000    2008-03-15 18:15:43.000
3   C     4000    2008-03-15 18:15:43.000

मुझे इसके बजाय यह पसंद आएगा:

ID  Name  Amount  Date
------------------------------------------
1  A     2000    2008-03-15 18:15:43.000
2  B     3000    2008-03-15 18:15:43.000
3  C     4000    2008-03-15 18:15:43.000
1  A     2000    2008-03-15 18:15:43.000
2  B     3000    2008-03-15 18:15:43.000
3  C     4000    2008-03-15 18:15:43.000

उत्तर:

जवाब के लिए 0 № 1

इसके लिए एक कर्सर का उपयोग करना एक गलती है। आपको सेट ऑपरेशंस का उपयोग करना चाहिए जहां आप कर सकते हैं:

INSERT INTO cursor_copied (id, name, amount, date)
SELECT ID, Name, Amount, Date
FROM cursor_created CROSS APPLY
(VALUES (1), (2)) copies(n);

यहां तक ​​कि यदि आप कर्सर के बारे में सीख रहे हैं, तो यह जानना वाकई महत्वपूर्ण है कि वे कब उचित हैं। और जब कोड को एक ही क्वेरी द्वारा प्रतिस्थापित किया जा सकता है तो वे लगभग कभी उचित नहीं होते हैं।


संबंधित सवाल
सबसे लोकप्रिय