11

自動インクリメント キー フィールドを使用して SQLServer テーブルに挿入しています。(これは、SQLServer では IDENTITY 列と呼ばれていると思います。)

Oracle では、RETURNING キーワードを使用して、生成された値を返す SELECT クエリのような結果セットを INSERT ステートメントに与えることができます。

INSERT INTO table
(foreign_key1, value)
VALUES
(9, 'text')
RETURNING key_field INTO :var;

SQLServer でこれを達成するにはどうすればよいですか?

おまけ: わかりました。ここまではいい回答ですが、可能であれば、それを 1 つのステートメントにまとめるにはどうすればよいですか? :)

4

7 に答える 7

17

一般に、それは単一のステートメントでは実行できません。

しかし、SELECT SCOPE_IDENTITY() は INSERT ステートメントの直後に配置できます (また配置する必要があります)。そのため、すべて同じデータベース呼び出しで実行されます。

例:

mydb.ExecuteSql("INSERT INTO table(foreign_key1, value) VALUES(9, 'text'); SELECT SCOPE_IDENTITY();");

OUTPUT を使用できますが、注意すべきいくつかの制限があります。

http://msdn.microsoft.com/en-us/library/ms177564.aspx

于 2009-06-10T16:17:06.993 に答える
9
SELECT SCOPE_IDENTITY()

編集:遊びをしています...

OUTPUT句のみがローカル変数をサポートしている場合。

とにかく、シングルトンではなくIDの範囲を取得するには

DECLARE @Mytable TABLE (keycol int IDENTITY (1, 1), valuecol varchar(50))

INSERT @Mytable (valuecol) 
OUTPUT Inserted.keycol
SELECT 'harry'
UNION ALL
SELECT 'dick'
UNION ALL
SELECT 'tom'

編集 2: 1 回の通話で。この構成を使用する機会はありませんでした。

DECLARE @Mytable TABLE (keycol int IDENTITY (1, 1), valuecol varchar(50))

INSERT @Mytable (valuecol) 
OUTPUT Inserted.keycol
VALUES('foobar')
于 2009-06-10T16:09:32.157 に答える
4

@@IDENTITY に加えて、SCOPE_IDENTITY() と IDENT_CURRENT() も調べる必要があります。ほとんどの場合、SCOPE_IDENTITY() が必要です。@@IDENTITY には、追跡しようとしている実際のテーブルのトリガーで作成された ID 値が返される可能性があるという問題があります。

また、これらは単一値関数です。Oracle RETURNING キーワードの仕組みがわかりません。

于 2009-06-10T16:11:44.900 に答える
2

SCOPE_IDENTITY

于 2009-06-10T16:10:17.507 に答える
2

呼び出しコンテキストによって異なります。

これをクライアント コードから呼び出す場合は、OUTPUT を使用して、返された値を読み取ることができます。

DECLARE @t TABLE (ColID int IDENTITY, ColStr varchar(20))

INSERT INTO @t (ColStr)
OUTPUT Inserted.ColID
VALUES ('Hello World')

結果:

      ColID
-----------
          1

これをストアド プロシージャでラップしている場合は、OUTPUT を使用する方が手間がかかります。そこで SCOPE_IDENTITY() を使いたいと思うでしょうが、単一のステートメントでそれを行うことはできません。確かに、「;」を使用して 1 行に複数のステートメントを入れることができます。区切りですが、それは単一のステートメントではありません。

DECLARE @idValue    int
DECLARE @t TABLE (ColID int IDENTITY, ColStr varchar(20))

INSERT INTO @t (ColStr) VALUES ('Hello World')

SELECT @idValue = SCOPE_IDENTITY()

結果: @idValue 変数に ID 値が含まれます。値を返すには、OUTPUT パラメータを使用します。

于 2009-06-10T21:02:18.260 に答える
0

OUTPUT INTOを使用できます。これには、挿入された複数の ID をキャプチャできるという追加の利点があります。

于 2009-06-10T16:16:14.733 に答える
0

INSERT INTO table(foreign_key1, value)VALUES(9, 'text');SELECT @@IDENTITY;

于 2009-06-10T16:17:43.107 に答える