Почему select SCOPE_IDENTITY () возвращает десятичное число вместо целого числа? - PullRequest
82 голосов
/ 08 апреля 2010

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

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

Ответы [ 4 ]

96 голосов
/ 08 апреля 2010

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

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

30 голосов
/ 08 апреля 2010

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

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

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

4 голосов
/ 08 апреля 2010

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

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

3 голосов
/ 08 апреля 2010

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

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