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

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

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

4 ответов


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

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


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

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

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


сфера личности возвращаемое значение decimal (38,0)

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


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

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