4

概要:INSERTステートメントでOUTPUT句
使用して、挿入先のテーブルに存在しない列を返す必要があります。それを回避できるのであれば、挿入先のテーブルに列を追加したくありません

詳細:
FinishedDocumentテーブルには1つの列しかありません。これは私が挿入しているテーブルです。

FinishedDocument
-DocumentID

私のドキュメントテーブルには2つの列があります。これは、データを返す必要があるテーブルです。

ドキュメント
-DocumentID-
説明

次の例では、FinishedDocumentに1行を挿入します。そのOUTPUT句は、挿入されたDocumentIDを返します。これは機能しますが、挿入されたドキュメントの説明が表示されません。

INSERT INTO FinishedDocument
OUTPUT INSERTED.DocumentID
SELECT DocumentID
FROM Document
WHERE DocumentID = @DocumentID

Documentテーブルから、INSERTから一致するドキュメントのDocumentIDとDescriptionの両方を返す必要があります。

これを実現するにはどのような構文が必要ですか?OUTPUT句を微調整することで(はっきりと理解できない方法で)、1つのINSERTステートメントでのみ可能だと思いますか?

私がここで下る道に似ていないより賢い方法はありますか?

編集: SQL Server 2005

4

6 に答える 6

3

例Aを見てください:

DECLARE @temp TABLE (DocumentID int)

INSERT INTO FinishedDocument 
    OUTPUT INSERTED.DocumentID 
    INTO @temp
SELECT DocumentID 
FROM Document 
WHERE DocumentID = @DocumentID 

SELECT Document.DocumentId, Document.Description
FROM @temp AS t
INNER JOIN Document 
    ON t.DocumentID = Document.DocumentID
于 2010-05-14T17:55:57.427 に答える
1

このようにバックドアできるかどうか疑問に思います(私が実際にこの方法でそれを行うことを検討することは私に関係がありますか?):

;WITH r (DocumentID)
     AS (INSERT INTO FinishedDocument
         OUTPUT INSERTED.DocumentID
         SELECT DocumentID
           FROM Document
          WHERE DocumentID = @DocumentID)
 SELECT d.DocumentID, d.DocumentName
   FROM Document d
   JOIN r
     ON d.DocumentID = r.DocumentID

挿入は引き続きOUTPUT句を使用しますが、必要な情報を取得するためにドキュメントにリンクするインラインテーブルとして使用します。とはいえ、どういうわけか、これがWITH句をどうしようもなくろくでなしにしているという感覚から逃れることはできません...

于 2010-05-14T16:16:21.137 に答える
1

OUTPUT句には、操作対象の任意のフィールドを含めることができます。たとえば、データを挿入するフィールドの場合などです。つまり、FinishedDocumentテーブルの任意の列です。

ただし、OUTPUT句は、他のテーブルからデータを結合または取得することはできません。

于 2010-05-14T16:16:32.340 に答える
0

インサートをCTEにラップし、選択時に出力をドキュメントテーブルに結合します。

于 2010-05-14T16:17:14.037 に答える
0

2008年には、MERGEステートメントを使用してそれを行うことができます。多分あなたはアップグレードを検討することができます:)

MERGE INTO FinishedDocument
USING Document d ON 1=0
WHEN NOT MATCHED AND d.DocumentID = @DocumentID THEN
INSERT (DocumentID) VALUES (@DocumentID)
OUTPUT d.DocumentID, d.Description;

これを試す前に、実行計画を確認することをお勧めします。

その価値はありますか?変数から挿入するだけなので、1つは選択し、もう1つは挿入する2つのステートメントを使用しても、余分なコストはかかりません。2つのステートメントを使用します。

于 2010-05-14T16:36:00.327 に答える
0

このようなものはどうですか?

create table FinishedDocument (
    DocumentId int
)

create table Document (
    DocumentId int,
    Description nvarchar(100)
)

create table #tmpDoc (
    DocumentId int
)

insert into Document
    (DocumentId, Description)
    values
    (1, 'Test')

insert into FinishedDocument
    (DocumentId)
    output Inserted.DocumentId into #tmpDoc 
    select D.DocumentId
        from Document D
        where D.DocumentId = 1

select D.DocumentId, D.Description
    from #tmpDoc t
        inner join Document D
            on t.DocumentId = D.DocumentId

drop table #tmpDoc      
drop table FinishedDocument
drop table Document
于 2010-05-14T18:53:13.667 に答える