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

Итак, у меня есть таблица с столбцом идентификатора в качестве первичного ключа, поэтому это целое число. Итак, почему SCOPE_IDENTITY() всегда возвращает десятичное значение вместо int в мое приложение С#? Это действительно раздражает, поскольку десятичные значения не будут в явном виде конвертировать в целые числа в С#, а это значит, что теперь мне приходится переписывать кучу вещей и иметь много вспомогательных методов, потому что я использую SQL Server и Postgres, которые Postgres возвращает целое число для эквивалентная функция.

Почему SCOPE_IDENTITY() не просто возвращает простое целое число? Есть ли люди, которые обычно используют десятичные/неденежные значения для первичных ключей?

Ответ 1

В SQL Server свойство IDENTITY может быть назначено столбцам tinyint, smallint, int, bigint, decimal(p, 0) или numeric(p, 0). Поэтому функция SCOPE_IDENTITY должна возвращать тип данных, который может охватывать все вышеперечисленное.

Как уже говорилось в предыдущих ответах, просто верните его на int на сервере, прежде чем возвращать его, тогда ADO.NET обнаружит его тип, как вы ожидаете.

Ответ 2

Не можете ли вы просто отбросить его, прежде чем возвращать его из вашего запроса или сохраненного proc (SPs alway возвращают int в любом случае, но, возможно, вы используете выходной параметр)?

Как SELECT CAST(SCOPE_IDENTITY() AS INT) AS LAST_IDENTITY

И почему это так? Вероятно, чтобы быть более гибким и обрабатывать большие числа.

Ответ 3

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

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

Ответ 4

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

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