เหตุใดจึงเลือก SCOPE_IDENTITY () ส่งคืนทศนิยมแทนที่จะเป็นจำนวนเต็ม


91

ดังนั้นฉันจึงมีตารางที่มีคอลัมน์ข้อมูลประจำตัวเป็นคีย์หลักดังนั้นมันจึงเป็นจำนวนเต็ม เหตุใดจึงSCOPE_IDENTITY()ส่งคืนค่าทศนิยมแทนที่จะเป็น int ไปยังแอปพลิเคชัน C # ของฉันเสมอ นี่เป็นเรื่องที่น่ารำคาญจริงๆเนื่องจากค่าทศนิยมจะไม่แปลงเป็นจำนวนเต็มใน C # โดยปริยายซึ่งหมายความว่าตอนนี้ฉันต้องเขียนสิ่งต่างๆมากมายและมีวิธีการช่วยเหลือมากมายเพราะฉันใช้ SQL Server และ Postgres ซึ่ง Postgres จะส่งคืนจำนวนเต็มสำหรับ ฟังก์ชันเทียบเท่า ..

ทำไมSCOPE_IDENTITY()ไม่คืนค่าจำนวนเต็มธรรมดา มีคนทั่วไปที่ใช้ค่าทศนิยม / ไม่ใช่ตัวตนสำหรับคีย์หลักหรือไม่?

คำตอบ:


106

ใน SQL Server ที่IDENTITYคุณสมบัติที่สามารถกำหนดให้tinyint, smallint, int, bigint, decimal(p, 0)หรือnumeric(p, 0)คอลัมน์ ดังนั้นSCOPE_IDENTITYฟังก์ชันจึงต้องส่งคืนชนิดข้อมูลที่สามารถครอบคลุมทั้งหมดข้างต้น

ตามคำตอบก่อนหน้านี้เพียงแค่ส่งไปintที่เซิร์ฟเวอร์ก่อนส่งคืนจากนั้น ADO.NET จะตรวจจับประเภทตามที่คุณคาด


2
SCOPE_IDENTITYค่าที่ส่งคืนฟังก์ชันเป็นทศนิยม (38,0)
Kiquenet

37

คุณไม่สามารถส่งก่อนส่งคืนจากแบบสอบถามหรือ proc ที่จัดเก็บไว้ได้ (SPs ยังคงส่งคืน int อยู่แล้ว แต่บางทีคุณอาจใช้พารามิเตอร์เอาต์พุต)?

ชอบ SELECT CAST(SCOPE_IDENTITY() AS INT) AS LAST_IDENTITY

และทำไมมันถึงทำเช่นนี้? อาจมีความยืดหยุ่นมากขึ้นและจัดการกับจำนวนที่มากขึ้น


SCOPE_IDENTITYเป็นฟังก์ชันในตัว .. ดังนั้นเมื่อทำเช่นExecuteScalar('insert...; select scope_identity());นั้นมันจะส่งคืนทศนิยมจากฟังก์ชันนั้นแทนที่จะเป็น int ที่คาดไว้
Earlz

@Earlz ดังนั้นเปลี่ยน SQL เป็น ExecuteScalar ('insert ... ; select CAST (scope_identity () AS int)');
Cade Roux

4

ค่าส่งคืนข้อมูลประจำตัวขอบเขตเป็นทศนิยม (38,0)

แคสต์ใช้คำสั่ง OUTPUT หรือกำหนดให้กับพารามิเตอร์เอาต์พุตแทนที่จะส่งSELECT SCOPE_IDENTITY()ให้กับไคลเอ็นต์


ในกรณีของฉันคอลัมน์มีชนิดข้อมูลintแต่SCOPE_IDENTITY()ด้วยเหตุผลบางประการส่งคืนSystem.Decimal... OUTPUTอนุประโยคส่งคืนจำนวนเต็มตามที่คาดไว้ขอบคุณมาก!
Erik Barke

3

ลองใช้สิ่งนี้และคุณจะได้รับจำนวนเต็มกลับมา:

ExecuteScalar('insert...; select CONVERT(int,scope_identity())');

0

นี่ไม่ใช่คำตอบที่แน่นอนสำหรับคำถามตามที่ถาม แต่จากคำตอบข้างต้นเป็นอย่างไร (ใน T-SQL - MS SQLServer):

เลือกแปลง (bigint, SCOPE_IDENTITY ())

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