web-dev-qa-db-ja.com

select SCOPE_IDENTITY()が整数ではなく小数を返すのはなぜですか?

したがって、主キーとしてID列を持つテーブルがあるので、それは整数です。それで、なぜSCOPE_IDENTITY()はC#アプリケーションにintではなく常に10進値を返すのですか?これは、C#で10進数値が暗黙的に整数に変換されないため、本当に面倒です。つまり、Postgresは同等の機能..

なぜSCOPE_IDENTITY()は単なる整数を返さないのですか?主キーに小数/非同一値を一般的に使用する人はいますか?

82
Earlz

SQL Serverでは、IDENTITYプロパティをtinyintsmallintintbigintdecimal(p, 0)に割り当てることができます、またはnumeric(p, 0)列。したがって、SCOPE_IDENTITY関数は、上記のすべてを網羅できるデータ型を返す必要があります。

前の回答で述べたように、返す前にサーバー上のintにキャストするだけで、ADO.NETは期待どおりにそのタイプを検出します。

97

クエリまたはストアドプロシージャから返す前にキャストすることはできません(SPは常にintを返しますが、出力パラメーターを使用している可能性があります)。

SELECT CAST(SCOPE_IDENTITY() AS INT) AS LAST_IDENTITYのように

そして、なぜこれを行うのですか?おそらく、より柔軟になり、より大きな数を処理するでしょう。

30
Cade Roux

スコープID 戻り値はdecimal(38,0)

キャストする、OUTPUT句を使用する、またはSELECT SCOPE_IDENTITY()ではなく出力パラメーターにクライアントに割り当てる

4
gbn

これを使用してみると、整数が返されます:

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