4

摘要:
我需要在INSERT语句上使用OUTPUT 子句来返回我要插入的表中不存在的列。如果可以避免,我不想在要插入的表中添加列

详细信息:
我的 FinishedDocument 表只有一列。这是我要插入的表。

FinishedDocument
-- DocumentID

我的文档表有两列。这是我需要从中返回数据的表。

文档
-- DocumentID
-- 描述

下面在 FinishedDocument 中插入一行。它的 OUTPUT 子句返回插入的 DocumentID。这有效,但它没有给我插入文档的描述。

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

我需要从文档表中返回来自INSERT 的 DocumentID 和匹配文档的描述。

我需要什么语法才能做到这一点?我认为只有通过调整 OUTPUT 子句(以我显然不明白的方式)的一个 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 子句,但作为一个内联表,然后链接到 Document 以获取您所需的信息。虽然,出于某种原因,我无法摆脱这种无助地使 WITH 子句混为一谈的感觉......

于 2010-05-14T16:16:21.137 回答
1

OUTPUT 子句可以包含它操作的任何字段,例如在您的情况下:您要插入数据的任何字段。这意味着:表中的任何列FinishedDocument

但是,OUTPUT 子句不能连接或从其他表中获取数据。

于 2010-05-14T16:16:32.340 回答
0

In 2008 you can do it with a MERGE statement. Maybe you could consider upgrading :)

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;

I suggest you check the execution plan before you try this.

Is it worth it? You are only inserting from a variable so having two statements, one to select and one to insert isn't going to cost you anything extra. Use two statements.

于 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 回答
0

将插入包装到 CTE 中,然后在选择时将输出连接回文档表。

于 2010-05-14T16:17:14.037 回答