输出列不在目标表中?

时间:2010-05-14 16:10:18

标签: sql-server sql-server-2005 insert output-clause

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

详情:
我的FinishedDocument表只有一列。这是我要插入的表格。

FinishedDocument
- DocumentID

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

文献
- 文件ID
- 说明

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

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

我需要从Document表返回文件ID中的和INSERT中匹配文档的描述。

我需要什么语法来解决这个问题?我认为只有一个INSERT语句,通过调整OUTPUT子句(以我明显不理解的方式)才有可能吗?

是否有更聪明的方式与我在这里的路径不相似?

编辑: SQL Server 2005

6 个答案:

答案 0 :(得分:2)

查看Example 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

答案 1 :(得分: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条款混为一谈的感觉......

答案 2 :(得分:1)

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

然而,OUTPUT子句无法连接或从其他表中获取数据。

答案 3 :(得分:0)

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

答案 4 :(得分: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;

我建议您在尝试之前检查执行计划。

值得吗?你只是从一个变量中插入,所以有两个语句,一个用于选择,一个用于插入不会花费你额外的费用。使用两个陈述。

答案 5 :(得分: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