2010-05-14 51 views
3

摘要:
我需要使用OUTPUT clauseINSERT语句返回不上我插入该表中存在的列。如果我可以避免它,我不想将列添加到我要插入的表输出列不在目标表中?

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

FinishedDocument
- DocumentID

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

文献
- DocumentID
- 描述

下面插入一个行插入FinishedDocument。它的OUTPUT子句返回插入的DocumentID。这可以工作,但它不会给我插入文档的描述。

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

我需要从文件表两个DocumentID从插入匹配文档的描述返回

我需要什么样的语法才能解决这个问题?我认为只有使用一条INSERT语句才可能,通过调整OUTPUT子句(以一种我清楚不明白的方式)?

有没有更类似于我要在这里下的路径的更聪明的方法?

编辑: SQL Server 2005中

+1

我是疯了还是你简化了这个,让真正的问题不明显?您不需要输出documentid,它已经存储在一个变量中。 – HLGEM 2010-05-14 19:26:27

回答

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 
+0

您链接的页面声明“在包含子句的INSERT语句中不支持OUTPUT INTO子句”。原来,我的真实世界的查询就是这个的受害者。 – lance 2010-05-14 18:32:43

+0

效率不高,但似乎是完成这项工作的唯一方法。 – 2013-02-04 20:38:54

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条款的绝望感......

+0

+1击败了我,你有一个完整的例子。 – NotMe 2010-05-14 16:17:35

+3

INSERT在CTE中是无效的(语法错误) – sqlvogel 2010-05-14 16:33:07

+0

我被引导认为CTE只能在它内部有一个SELECT语句......所以尽管这篇技巧看起来很好,但我怀疑它会起作用。 – 2010-05-14 17:10:26

1

OUTPUT子句可以包含它在其上运行的任何字段,例如,在你的情况下:你要插入数据的任何字段。这意味着:来自FinishedDocument表的任何列。

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

0

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

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; 

我建议你在尝试这个之前检查执行计划。

它值得吗?你只是从一个变量插入,所以有两个语句,一个选择和一个插入不会花费任何额外的东西。使用两个语句。

+0

我的现实世界比我的问题复杂一点。在我的真实世界中,这是在一个存储过程中,多个用户将同时调用,并且@DocumentID实际上是一个条件,直到INSERT发生时才会传递。所以,恐怕SELECT-then-INSERT可能会导致两个用户获取相同的文档(因为UserB在UserA选择RowX之后调用了sproc和SELECTed RowX(但在UserA INSERTed之前),这会阻止UserB获得相同的文档row) – lance 2010-05-14 16:55:11

+0

做相反的事情,从INSERT语句中输出ID,然后选择描述 – sqlvogel 2010-05-14 17:52:16

+0

当我输出ID时 - 我将它存储起来(以后用于SELECT查询)?尝试将其存储到一个变量中,但我无法弄清楚语法,“在包含子句的INSERT语句中不支持OUTPUT INTO子句”(http://msdn.microsoft.com/zh-cn/ us/library/ms177564.aspx),所以我不能使用临时表? – lance 2010-05-14 18:27:59

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 
+0

http://msdn.microsoft.com/en-us/library/ms177564.aspx指出“OUTPUT INTO子句在包含子句的INSERT语句中不受支持”。事实证明,我的真实世界查询是这个问题的牺牲品。 :( – lance 2010-05-14 18:57:30

+0

你可以选择你的进入临时表并使用它插入? – 2010-05-14 19:31:38