Почему 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())');