ฉันจะรับจำนวนบันทึกที่ได้รับผลกระทบจากขั้นตอนการจัดเก็บได้อย่างไร?


86

สำหรับINSERT, UPDATEและDELETESQL งบดำเนินการโดยตรงกับฐานข้อมูลของผู้ให้บริการฐานข้อมูลส่วนใหญ่กลับมานับแถวที่ได้รับผลกระทบ -1สำหรับขั้นตอนการจัดเก็บจำนวนของระเบียนที่ได้รับผลกระทบอยู่เสมอ

เราจะได้รับจำนวนบันทึกที่ได้รับผลกระทบจากขั้นตอนการจัดเก็บอย่างไร?


1
การตั้งค่าไม่นับก็เป็นปัญหาของฉันเช่นกัน ในการทดสอบให้ดำเนินการตามขั้นตอนการจัดเก็บของคุณในสตูดิโอการจัดการและดูว่าคุณได้รับการนับหรือไม่ถ้าคุณทำได้จากนั้นตรวจสอบให้แน่ใจว่าคุณมีเอาต์พุตที่เปลี่ยนแปลงได้
user2624356

คำตอบ:


80

ลงทะเบียนพารามิเตอร์ out สำหรับกระบวนงานที่เก็บไว้และตั้งค่าตาม@@ROWCOUNTถ้าใช้ SQL Server ใช้SQL%ROWCOUNTหากคุณใช้ Oracle

โปรดทราบว่าหากคุณมีหลายรายการINSERT/UPDATE/DELETEคุณจะต้องมีตัวแปรเพื่อเก็บผลลัพธ์จาก@@ROWCOUNTการดำเนินการแต่ละครั้ง


46

@@RowCount จะให้จำนวนระเบียนที่ได้รับผลกระทบจากคำสั่ง SQL

ใช้@@RowCountงานได้ก็ต่อเมื่อคุณออกทันทีหลังจากนั้น ดังนั้นหากคุณกำลังดักจับข้อผิดพลาดคุณต้องทำในบรรทัดเดียวกัน หากคุณแยกมันออกคุณจะพลาดสิ่งที่คุณใส่เป็นอันดับสอง

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

หากคุณมีหลายคำสั่งคุณจะต้องจับจำนวนแถวที่ได้รับผลกระทบสำหรับแต่ละรายการและรวมเข้าด้วยกัน

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

33

ปรากฎว่าสำหรับฉันที่SET NOCOUNT ONตั้งค่าไว้ในสคริปต์โพรซีเดอร์ที่เก็บไว้ (โดยค่าเริ่มต้นบน SQL Server Management Studio) และSqlCommand.ExecuteNonQuery();ส่งกลับ -1 เสมอ

ฉันเพียงแค่ตั้งค่าให้ปิด: โดยไม่จำเป็นต้องใช้SET NOCOUNT OFF@@ROWCOUNT

พบรายละเอียดเพิ่มเติมที่นี่: SqlCommand.ExecuteNonQuery () คืนค่า -1 เมื่อทำการแทรก / อัปเดต / ลบ


สิ่งนี้ใช้ได้กับฉัน proc ที่เก็บไว้ของฉันเป็นเพียงคำสั่งแทรกธรรมดาและดูเหมือนว่าจะใช้งานได้ ขอบคุณ!
Harvey Darvey

ขอบคุณ! ดีในการอ้างอิง
Leo Gurdian

8

สำหรับ Microsoft SQL Server คุณสามารถส่งคืน@@ROWCOUNTตัวแปรเพื่อส่งคืนจำนวนแถวที่ได้รับผลกระทบจากคำสั่งสุดท้ายในกระบวนงานที่เก็บไว้



-2

คำเตือน: @@ROWCOUNTอาจส่งคืนข้อมูลปลอมหากตารางที่ถูกเปลี่ยนแปลงมีทริกเกอร์ที่แนบมา!

@@ROWCOUNTจะกลับจำนวนของระเบียนผลกระทบจากการเรียกที่ไม่ได้คำสั่งที่เกิดขึ้นจริง!


8
ปรากฎว่าไม่เป็นความจริง: stackoverflow.com/questions/7005225/…
เต๋า
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.