1

おはよう。2つのテーブルがあり、一方が他方を参照しています。主キーに挿入すると、主キーは自動生成されます。つまり、IDフィールドです。この値を2番目のテーブルに挿入する必要があります。

OUTPUT句を使用すると、挿入されたばかりのID値が得られることがわかったので、これを試しました。

insert into owners (pId) 
   insert into personal (firstName) 
   output inserted.pId 
   values ('fn')

しかし、それは機能しません。エラーが発生します:

キーワード「挿入」の近くの構文が正しくありません

個人テーブルはプライマリテーブルであり、所有者テーブルには外部キーが含まれています。SQL Serverで必要なことをどのように行うことができますか?

私は過去2日間ここで立ち往生しています...

4

6 に答える 6

4

構文が少しずれていると思います。メインテーブルに挿入された値を確実に取得し、OUTPUT句を使用してそれらをセカンダリテーブルに挿入できます。

INSERT INTO dbo.personal(firstName) 
OUTPUT INSERTED.pId INTO dbo.owners(pId) 
VALUES('fn')

これにより、新しい行がに挿入され、列がにpersonal設定されます。その挿入から、挿入された行のID列が、そのテーブルの列として他のテーブルに挿入されます。firstNamefnpIdownerspId

詳細については、OUTPUT句のMSDNドキュメントを参照してください。挿入された値のいずれかをコンソール(SQL Server Mgmt Studioなど)に出力するか、それらの値を一時テーブルまたは永続テーブルに出力できます。

更新:「dradu」が指摘しているように、ownersテーブルの列はFK制約の一部であるため、このアプローチはここでは機能しません(私はあなたの質問からその点を見逃していました)。したがって、これを行うには他の方法を使用する必要があります-おそらく必要な情報をコードの一時テーブル/テーブル変数に出力します

于 2012-06-21T05:36:16.630 に答える
3

外部キーのためOUTPUTに句を直接使用できないため、生成されたIDを一時テーブルに追加してから、それらの値をテーブルに挿入できownersます。

BEGIN TRANSACTION 

CREATE TABLE #ids(ID INT)
INSERT INTO personal(firstName)
    OUTPUT inserted.pid INTO #ids
    SELECT 'A'
    UNION SELECT 'B'

INSERT INTO owners(pid)
    SELECT ID FROM #ids

COMMIT TRANSACTION

SCOPE_IDENTITY動作しますが、1つの値に制限されます。

于 2012-06-21T04:59:04.307 に答える
3

次の手順を試してください

1)挿入時にトランザクションレベルを適用します

2)Scope_Identity()関数を使用して、最後に挿入されたIDを取得します。

トランザクションレベルを適用すると、テーブルがロックされ、他の/同じユーザーはこの時間に値を挿入できなくなります。

これを試してみてください。

于 2012-06-21T05:01:15.073 に答える
2

SCOPE_IDENTITY()関数を使用して、挿入されたID値を返すことができます。

DECLARE @id INT
INSERT INTO [Personal] (Colums ....) VALUES (this, that, stuff)
SET @id = SCOPE_IDENTITY()

INSERT INTO [Owners] (Colums ....) VALUES (@id ....)
于 2012-06-21T04:35:09.810 に答える
2

あなたのオプションは使用することだと思いますがSCOPE_IDENTITY()、あなたのオプションに最も近い他のオプションもIDENT_CURRENT(‘tablename’)そうだと思いました。他のIDオプションの詳細も投稿します。これは、あなたの選択を理解するのに役立ち、また別の機会に役立つかもしれません。

@@ IDENTITY値を生成したテーブルに関係なく、また値を生成したステートメントのスコープに関係なく、接続で生成された最後のIDENTITY値を返します。


SCOPE_IDENTITY()値を生成したテーブルに関係なく、接続上および同じスコープ内のステートメントによって生成された最後のIDENTITY値を返します。


IDENT_CURRENT('tablename')値を作成した接続に関係なく、また値を作成したステートメントのスコープに関係なく、テーブルで作成された最後のIDENTITY値を返します。

于 2012-06-21T04:45:25.427 に答える
0

SCOPE_IDENTITY()を使用して最近のID値を取得する簡単な例を次に示します http://msdn.microsoft.com/en-us/library/ms190315.aspx

于 2013-03-27T00:03:50.640 に答える