sql - मैं संग्रहित प्रक्रिया से प्रभावित रिकॉर्ड्स की संख्या कैसे प्राप्त कर सकता हूं?




sql-server oracle tsql plsql (6)

INSERT , UPDATE और डेटाबेस के खिलाफ सीधे निष्पादित SQL कथन DELETE , अधिकांश डेटाबेस प्रदाता प्रभावित पंक्तियों की गणना वापस करते हैं। संग्रहीत प्रक्रियाओं के लिए, प्रभावित रिकॉर्ड की संख्या हमेशा -1

हम संग्रहीत प्रक्रिया से प्रभावित रिकॉर्ड्स की संख्या कैसे प्राप्त करते हैं?


Answers

@@RowCount आपको SQL स्टेटमेंट से प्रभावित रिकॉर्ड्स की संख्या देगा।

@@RowCount केवल तभी काम करता है जब आप तुरंत इसे जारी करते हैं। तो यदि आप त्रुटियों को फँस रहे हैं, तो आपको इसे एक ही पंक्ति पर करना होगा। यदि आप इसे विभाजित करते हैं, तो आप जो कुछ भी डालते हैं उस पर आप चूक जाएंगे।

SELECT @NumRowsChanged = @@ROWCOUNT, @ErrorCode = @@ERROR

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

SELECT @NumRowsChanged = @NumRowsChanged  + @@ROWCOUNT, @ErrorCode = @@ERROR

माइक्रोसॉफ्ट एसक्यूएल सर्वर के लिए आप संग्रहित प्रक्रिया में अंतिम कथन से प्रभावित पंक्तियों की संख्या को वापस करने के लिए @@ROWCOUNT चर वापस कर सकते हैं।


चेतावनी: @@ROWCOUNT बोगस डेटा वापस कर सकता है यदि तालिका में बदलाव किया गया है तो इसमें ट्रिगर्स संलग्न हैं!

@@ROWCOUNT ट्रिगर द्वारा प्रभावित रिकॉर्ड की संख्या वापस करेगा, वास्तविक बयान नहीं!


मेरे लिए बाहर निकलता है कि SET NOCOUNT ON संग्रहीत प्रक्रिया स्क्रिप्ट (SQL सर्वर प्रबंधन स्टूडियो पर डिफ़ॉल्ट रूप से) और SqlCommand.ExecuteNonQuery(); SET NOCOUNT ON सेट किया गया था SqlCommand.ExecuteNonQuery(); हमेशा लौटा -1।

मैंने बस इसे बंद कर दिया है: @@ROWCOUNT का उपयोग किए बिना SET NOCOUNT OFF करें।

यहां अधिक जानकारी मिली: SqlCommand.ExecuteNonQuery () प्रविष्टि / अपडेट / हटाते समय -1 लौटाता है


संग्रहीत प्रक्रिया के लिए आउट पैरामीटर पंजीकृत करें, और SQL सर्वर का उपयोग करते हुए @@ROWCOUNT आधार पर मान सेट करें। यदि आप ओरेकल का उपयोग कर रहे हैं तो SQL%ROWCOUNT का उपयोग करें।

ध्यान दें कि यदि आपके पास एकाधिक INSERT/UPDATE/DELETE , तो आपको प्रत्येक ऑपरेशन के लिए @@ROWCOUNT से परिणाम संग्रहीत करने के लिए एक चर की आवश्यकता होगी।


एक अच्छा विचार है 'ऑब्जेक्ट-रिलेशनल मैपर' जैसे Idiorm :

$user = ORM::for_table('user')
->where_equal('username', 'j4mie')
->find_one();

$user->first_name = 'Jamie';
$user->save();

$tweets = ORM::for_table('tweet')
    ->select('tweet.*')
    ->join('user', array(
        'user.id', '=', 'tweet.user_id'
    ))
    ->where_equal('user.username', 'j4mie')
    ->find_many();

foreach ($tweets as $tweet) {
    echo $tweet->text;
}

यह न केवल आपको SQL इंजेक्शन से बचाता है बल्कि सिंटैक्स त्रुटियों से भी बचाता है! एक बार और एकाधिक कनेक्शन में कई परिणामों पर कार्रवाई को फ़िल्टर करने या लागू करने के लिए विधि श्रृंखला के साथ मॉडलों के संग्रह का भी समर्थन करता है।







sql sql-server oracle tsql plsql