2010-04-08 1 views
73

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

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

ответ

84

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

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

+1

Я не знал, что у вас может быть что угодно, кроме int и bigint для первичного ключа. – Earlz

+0

Функция возврата SCOPE_IDENTITY' *** десятичная (38,0) *** – Kiquenet

27

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

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

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

+0

'SCOPE_IDENTITY' является встроенной функцией .. поэтому, делая как' ExecuteScalar ('вставка ..., выберите SCOPE_IDENTITY()) ; 'он вернет десятичную цифру из этой функции, а не ожидаемый int. – Earlz

+0

@Earlz, поэтому измените SQL на ExecuteScalar ('insert ...; выберите CAST (scope_identity() AS int)'); –

3

Scope identity возвращаемое значение десятичное (38,0)

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

3

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

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