2008-10-06 17 views
42

SQL सर्वर 2005 में, पंक्तियों को हटाने का एक तरीका है और बताया जा रहा है कि वास्तव में हटा दिए गए थे?SQL सर्वर संग्रहीत प्रक्रिया में हटाए गए पंक्तियों की संख्या की गणना

मैं उसी स्थिति के साथ select count(*) कर सकता था, लेकिन मुझे इसे पूरी तरह भरोसेमंद होने की आवश्यकता है।

मेरा पहला अनुमान @@ROWCOUNT चर का उपयोग करना था - लेकिन यह सेट नहीं है, उदा।

delete 
from mytable 
where datefield = '5-Oct-2008' 

select @@ROWCOUNT 

हमेशा एक 0.

MSDN पता चलता है OUTPUT निर्माण, उदा रिटर्न

delete from mytable 
where datefield = '5-Oct-2008' 
output datefield into #doomed 

select count(*) 
from #doomed 

यह वास्तव में एक वाक्यविन्यास त्रुटि के साथ विफल रहता है।

कोई विचार?

उत्तर

47

आप SET NOCOUNT OFF की कोशिश की?

+0

मैंने सोचा था कि मैंने यह कोशिश की थी - लेकिन स्पष्ट रूप से मैंने ऐसा नहीं किया क्योंकि यह एक आकर्षण की तरह काम करता था - धन्यवाद। – Unsliced

+1

एमएसडीएन का कहना है कि एसईटी एनओसीएटी प्रिंट-आउट को प्रभावित करता है। यह '@@ ROWCOUNT' को क्यों प्रभावित करता है? क्या यह हमेशा पंक्तियों की संख्या को वापस नहीं लेना चाहिए (ओपी में)? – noelicus

+0

*** यह अनुमान है *** मुझे लगता है कि ऐसा इसलिए है क्योंकि एनओसीएटी सेटिंग को सिस्टम को बताता है कि चीजों को और अधिक कुशल बनाने के लिए इसे संख्याओं का ट्रैक रखने की आवश्यकता नहीं है – wcm

0

एक कॉलम, आईडी के साथ temp तालिका बनाएं।

उन आईड्स का चयन करके अस्थायी तालिका में डालें जिन्हें आप हटाना चाहते हैं। यह आपको अपनी गिनती देता है।

अपनी मेज से हटाएँ जहां आईडी (अस्थायी तालिका से चयन आईडी) में

+1

हालांकि कुछ ऐसा काम करेगा, इस तरह के कुछ ओवरहेड एक अपशिष्ट है। –

+0

यह वास्तव में एक खराब प्रदर्शन देगा, क्वेरी कम से कम 2 गुना अधिक समय लेगी, जो कि यदि आप बहुत सारे रिकॉर्ड प्रबंधित कर रहे हैं तो यह काफी समय हो सकता है। हालांकि रचनात्मक सोच! –

3

आपके उदाहरण में @@ROWCOUNT काम करना चाहिए - कई हटाई गई पंक्तियों को जानने का यह एक उचित तरीका है। आप अपने आवेदन से कुछ को नष्ट करने की कोशिश कर रहे हैं तो आप केवल संदेश आप निष्पादन के बाद मिलता है को प्रभावित करता है, तब भी जब सेट NOCOUNT SET NOCOUNT के रूप में चालू है SET NOCOUNT ON

का उपयोग करने के लिए MSDN @@ ROWCOUNT समारोह अद्यतन किया जाता है के अनुसार की आवश्यकता होगी ।

तो यदि आप @@ROWCOUNT के परिणामों के साथ काम करने की कोशिश कर रहे हैं, उदाहरण के लिए, ADO.NET तो SET NOCOUNT ON निश्चित रूप से सहायता करनी चाहिए।

8

मैं SQL2000 में इस सटीक उद्देश्य के लिए @@ ROWCOUNT का उपयोग करता हूं, बिना किसी समस्या के। सुनिश्चित करें कि आप अनजाने में इसे जांचने से पहले इस गिनती को रीसेट नहीं कर रहे हैं (बीओएल: 'यह चर किसी भी कथन द्वारा 0 पर सेट है जो पंक्तियों को वापस नहीं करता है, जैसे कि IF कथन')।

0

जिज्ञासा से, आप प्रक्रिया को कैसे कॉल कर रहे हैं? (मुझे लगता है कि यह एक संग्रहीत प्रक्रिया है?)। कारण मैं पूछता हूं कि संग्रहीत प्रक्रिया के वापसी मूल्य (जो इस मामले में 0 होगा) के बीच एक अंतर है, और एक रोसेट परिणाम - जो इस मामले में एक ही कॉलम के साथ एक पंक्ति होगी। ADO.Net में, पूर्व को पैरामीटर और बाद वाले को SQLLataReader के साथ एक्सेस किया जाएगा। क्या आप शायद प्रक्रिया के वापसी मूल्य को पंक्ति गणना के रूप में गलत कर रहे हैं?

+0

यह कोड एक ही स्थान पर था (लेकिन हाँ, एक संग्रहीत प्रक्रिया में) - मैं कुछ डेटा हटा रहा था, फिर उस तथ्य को एक स्टेटस टेबल पर लिख रहा था, इसलिए यह वास्तव में वापसी मूल्यों पर उलझन में नहीं था। – Unsliced

7

बस इस कार्य करें:

SET NOCOUNT off ; 
SELECT @p1 = @@ROWCOUNT 

जहां p1 उत्पादन पैरामीटर आप संग्रहीत प्रक्रिया में सेट है। उम्मीद है कि यह मदद करता है।

1

मुझे एक ऐसा मामला मिला जहां आप @@rowcount का उपयोग नहीं कर सकते, जैसे कि आप कुल गिनती के बजाय हटाए गए मानों की विशिष्ट गणना जानना चाहते हैं।इस मामले में आप निम्न कार्य करना होगा:

delete from mytable 
where datefield = '5-Oct-2008' 
output deleted.datefield into #doomed 

select count(distinct datefield) 
from #doomed 

ओपी में सिंटेक्स त्रुटि थी क्योंकि outputdeleteddatefield फ़ील्ड नाम से पहले शामिल नहीं किया।

संबंधित मुद्दे