कभी भी लूप करने की कोशिश न करें, डेटा के सेट पर काम करें।
आप एक ही समय में कई पंक्तियों को सम्मिलित, अद्यतन, हटा सकते हैं। यहां कई पंक्तियों के उदाहरण डालने में:
INSERT INTO YourTable
(col1, col2, col3, col4)
SELECT
cola, colb+Colz, colc, @X
FROM ....
LEFT OUTER JOIN ...
WHERE...
जब एक लूप को देखते हुए देखें कि यह इसके अंदर क्या किया गया है। यदि यह केवल आवेषण/हटाना/अपडेट है, तो एकल आदेशों का उपयोग करने के लिए पुनः लिखें। यदि आईएफ हैं, तो देखें कि क्या वे केस स्टेटमेंट्स या आवेषण/हटाए गए/अपडेट पर कहां स्थित हो सकते हैं। यदि ऐसा है, तो लूप को हटाएं और सेट कमांड का उपयोग करें।
मैंने लूप ले लिए हैं और उन्हें सेट आधारित कमांड के साथ बदल दिया है और निष्पादन समय को मिनटों से कुछ सेकंड तक घटा दिया है। मैंने कई नेस्टेड लूप और प्रक्रिया कॉल के साथ प्रक्रियाएं की हैं और लूप को रखा है (केवल आवेषण/हटाना/अपडेट का उपयोग करना असंभव था), लेकिन मैंने कर्सर को हटा दिया, और कम लॉकिंग/अवरुद्ध और बड़े प्रदर्शन को भी बढ़ावा दिया है। यहाँ दो पाशन तरीकों कि बेहतर कर्सर लूप रहे हैं ...
आप पाश करने के लिए है, एक सेट से अधिक कुछ इस तरह करते हैं:
--this looks up each row for every iteration
DECLARE @msg VARCHAR(250)
DECLARE @hostname sysname
--first select of currsor free loop
SELECT @hostname= min(RTRIM(hostname))
FROM master.dbo.sysprocesses (NOLOCK)
WHERE hostname <> ''
WHILE @hostname is not null
BEGIN
set @msg='exec master.dbo.xp_cmdshell "net send '
+ RTRIM(@hostname) + ' '
+ 'testing "'
print @msg
--EXEC (@msg)
--next select of cursor free loop
SELECT @hostname= min(RTRIM(hostname))
FROM master.dbo.sysprocesses (NOLOCK)
WHERE hostname <> ''
and hostname > @hostname
END
आप आइटम का एक उचित सेट (नहीं 100,000 अगर) पाश से अधिक आप यह कर सकते हैं करने के लिए:
--this will capture each Key to loop over
DECLARE @msg VARCHAR(250)
DECLARE @From int
DECLARE @To int
CREATE TABLE #Rows
(
RowID int not null primary key identity(1,1)
,hostname varchar(100)
)
INSERT INTO #Rows
SELECT DISTINCT hostname
FROM master.dbo.sysprocesses (NOLOCK)
WHERE hostname <> ''
SELECT @From=0,@[email protected]@ROWCOUNT
WHILE @From<@To
BEGIN
SET @[email protected]+1
SELECT @msg='exec master.dbo.xp_cmdshell "net send '
+ RTRIM(hostname) + ' '
+ 'testing "'
FROM #Rows WHERE [email protected]
print @msg
--EXEC (@msg)
END