Чому функція SCOPE_IDENTITY () повертає десяткову замість цілого числа?


90

Отже, у мене є таблиця зі стовпцем ідентичності як первинним ключем, тому це ціле число. Отже, чому SCOPE_IDENTITY()в моєму додатку C # завжди повертається десяткове значення замість int? Це насправді дратує, оскільки десяткові значення не будуть неявно перетворюватись на цілі числа в 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)
Кікенет

36

Чи не можете ви просто привести його перед тим, як повернути його із вашого запиту або збереженого proc (SP все одно завжди повертають int, але, можливо, ви використовуєте вихідний параметр)?

Люблю SELECT CAST(SCOPE_IDENTITY() AS INT) AS LAST_IDENTITY

І чому це робить? Можливо, щоб бути більш гнучким і обробляти більші цифри.


SCOPE_IDENTITY- це вбудована функція .. тому при виконанні подібних дій ExecuteScalar('insert...; select scope_identity());вона повертає десятковий знак від цієї функції, а не очікуваний int.
Earlz,

@Earlz, тому змініть SQL на ExecuteScalar ('вставка ...; виберіть CAST (scope_identity () AS int)');
Кейд Ру

4

Повернене значення ідентифікатора обсягу є десятковим (38,0)

CAST це, використовуйте речення OUTPUT або призначте вихідний параметр, а не SELECT SCOPE_IDENTITY()клієнту


У моєму випадку стовпець має тип даних, intале SCOPE_IDENTITY()з якихось причин повертає System.Decimal... OUTPUTЗастереження повертає ціле число, як очікувалося, тому дякую!
Ерік Барке,

3

спробуйте використати це, і ви отримаєте ціле число назад:

ExecuteScalar('insert...; select CONVERT(int,scope_identity())');
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.