Por que select SCOPE_IDENTITY () retorna um decimal em vez de um inteiro?

90

Portanto, tenho uma tabela com uma coluna de identidade como chave primária, portanto, é um número inteiro. Então, por que SCOPE_IDENTITY()sempre retorna um valor decimal em vez de um int para meu aplicativo C #? Isso é realmente irritante, pois os valores decimais não serão convertidos implicitamente em inteiros em C #, o que significa que agora tenho que reescrever um monte de coisas e tenho muitos métodos auxiliares porque uso o SQL Server e o Postgres, que o Postgres retorna um inteiro para o função equivalente ..

Por que SCOPE_IDENTITY()não retorna apenas um inteiro simples? Existem pessoas por aí que normalmente usam valores decimais / sem identidade para chaves primárias?

Earlz
fonte

Respostas:

106

No SQL Server, a IDENTITYpropriedade pode ser atribuído a tinyint, smallint, int, bigint, decimal(p, 0), ou numeric(p, 0)colunas. Portanto, a SCOPE_IDENTITYfunção deve retornar um tipo de dados que pode abranger todos os itens acima.

Como as respostas anteriores já disseram, apenas lance-o intno servidor antes de retorná-lo, então o ADO.NET detectará seu tipo conforme o esperado.

Christian Hayter
fonte
2
SCOPE_IDENTITYo valor de retorno da função é decimal (38,0)
Kiquenet
36

Você não pode simplesmente lançá-lo antes de retorná-lo de sua consulta ou procedimento armazenado (SPs sempre retornam int de qualquer maneira, mas talvez você esteja usando um parâmetro de saída)?

Gostar SELECT CAST(SCOPE_IDENTITY() AS INT) AS LAST_IDENTITY

E por que isso? Provavelmente para ser mais flexível e lidar com números maiores.

Cade Roux
fonte
SCOPE_IDENTITYé uma função incorporada .. então, ao fazer ExecuteScalar('insert...; select scope_identity());isso, ela retornará um decimal daquela função ao invés do int esperado.
Earlz,
@Earlz, então mude o SQL para ExecuteScalar ('inserir ...; selecione CAST (scope_identity () AS int)');
Cade Roux de
4

O valor de retorno da identidade do escopo é decimal (38,0)

CAST, use a cláusula OUTPUT ou atribua a um parâmetro de saída em vez de SELECT SCOPE_IDENTITY()ao cliente

gbn
fonte
No meu caso, a coluna tem o tipo de dados, intmas SCOPE_IDENTITY()por algum motivo retorna System.Decimal... A OUTPUTcláusula retorna um inteiro conforme o esperado, então obrigado!
Erik Barke de
3

tente usar isso e você receberá um número inteiro de volta:

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