Почему при выборе SCOPE_IDENTITY () возвращается десятичное число вместо целого?


91

Итак, у меня есть таблица со столбцом идентификаторов в качестве первичного ключа, поэтому это целое число. Итак, почему 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)
Kiquenet

37

Разве вы не можете просто использовать его перед тем, как вернуть его из вашего запроса или сохраненной процедуры (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)');
Cade Roux

4

Возвращаемое значение идентификатора области является десятичным (38,0)

CAST его, используйте предложение OUTPUT или назначьте параметр вывода, а не SELECT SCOPE_IDENTITY()клиент


В моем случае столбец имеет тип данных, intно SCOPE_IDENTITY()по какой-то причине возвращает System.Decimal... Предложение OUTPUTвозвращает целое число, как и ожидалось, поэтому спасибо!
Эрик Барке

3

попробуйте использовать это, и вы получите целое число:

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

0

Это не точный ответ на заданный вопрос, но в духе ответов выше, как насчет (в T-SQL - MS SQLServer):

выберите convert (bigint, SCOPE_IDENTITY ())

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.