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


90

つまり、ID列を主キーとして持つテーブルがあるので、それは整数です。では、なぜSCOPE_IDENTITY()C#アプリケーションにintではなく常に10進値を返すのですか?10進値は暗黙的にC#で整数に変換されないため、これは本当に厄介です。つまり、SQL ServerとPostgresを使用しているため、一連の要素を書き直し、多くのヘルパーメソッドを使用する必要があります。同等の機能

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

回答:


106

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

以前の答えが言ったようintに、それを返す前にサーバーにキャストするだけで、ADO.NETはその型を期待どおりに検出します。


2
SCOPE_IDENTITY関数の戻り値はdecimal(38,0)です
Kiquenet

36

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

お気に入り SELECT CAST(SCOPE_IDENTITY() AS INT) AS LAST_IDENTITY

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


SCOPE_IDENTITYは組み込み関数です。したがって、同様のExecuteScalar('insert...; select scope_identity());場合、期待されるintではなく、その関数から10進数が返されます。
Earlz

@ Earlz、SQLをExecuteScalar( 'insert ...; select CAST(scope_identity()AS int)');に変更します。
Cade Roux

4

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

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


私の場合、列にはデータ型intがありますがSCOPE_IDENTITY()、何らかの理由で返されますSystem.Decimal... OUTPUT句は期待どおりに整数を返します。
エリックバーク2018年

3

これを使ってみると、整数が返ってきます:

ExecuteScalar('insert...; select CONVERT(int,scope_identity())');
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.