Sql server 输出列不在目标表中?

Sql server 输出列不在目标表中?,sql-server,sql-server-2005,insert,output-clause,Sql Server,Sql Server 2005,Insert,Output Clause,总结: 我需要在语句中使用on来返回我要插入的表中不存在的列。如果可以避免,我不想向要插入的表中添加列 详情: 我的FinishedDocument表只有一列。这是我要插入的表格 完成文件 -文档ID 我的文档表有两列。这是我需要从中返回数据的表 文件 -文档ID -描述 以下内容将在FinishedDocument中插入一行。其OUTPUT子句返回插入的DocumentID。这是可行的,但它没有给出插入文档的描述 INSERT INTO FinishedDocument OUTPUT INSE

总结: 我需要在语句中使用on来返回我要插入的表中不存在的列。如果可以避免,我不想向要插入的表中添加列

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

完成文件 -文档ID

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

文件 -文档ID -描述

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

INSERT INTO FinishedDocument
OUTPUT INSERTED.DocumentID
SELECT DocumentID
FROM Document
WHERE DocumentID = @DocumentID
我需要从Document表返回INSERT中匹配文档的DocumentID和描述

我需要什么语法来完成这个任务?我认为只有一个INSERT语句才有可能,通过以我显然不理解的方式调整OUTPUT子句

有没有更聪明的方法不象我要走的路


编辑:SQL Server 2005 < /P> < P>我想知道你是否能像这样把后门关上,我会考虑这样做吗?

;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

insert仍然使用OUTPUT子句,但它是一个内联表,然后链接到文档以获取所需信息。但是,出于某种原因,我无法逃避这样一种感觉,那就是WITH子句毫无希望地被打乱了……

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


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

将insert包装到CTE中,然后在“选择”“将输出连接回文档表”。

在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;
我建议你在尝试之前检查一下执行计划

值得吗?您只是从一个变量中插入,所以有两个语句,一个要选择,一个要插入,不会额外花费任何费用。使用两个语句。

查看:


像这样的怎么样

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

我的现实世界比我的问题要复杂一些。在我的现实世界中,这是在一个存储过程中,多个用户将同时调用,@DocumentID实际上是一个条件,直到插入发生为止。因此,我担心选择然后插入可能会导致两个用户返回同一文档,因为UserB在UserA SELECTed RowX之后但在UserA INSERTed之前调用存储过程和SELECTed RowX,这将阻止UserB获取相同的行。反过来做。从INSERT语句中输出ID,然后选择描述。当我将ID-输出到SELECT查询中时,我应该将其存储到什么中以供以后使用?我尝试将其存储到变量中,但我无法理解语法,并且包含子句的INSERT语句不支持输出into子句,因此我不能使用temp表?我相信CTE中只能有一个SELECT语句。。。。所以,尽管这个技巧看起来不错,但我怀疑它是否有效。@marc_和David:我担心会发生这种情况,而且我手边没有SQL来测试它。加上这句话让我觉得很不舒服,在CTE里面插入了。。。我将提出其他内容并进行更新。您链接的页面表明,包含子句的INSERT语句不支持OUTPUT INTO子句。事实证明,我的真实世界查询就是这样的受害者。虽然效率不高,但似乎是完成这项工作的唯一方法。声明在包含子句的INSERT语句中不支持OUTPUT INTO子句。事实证明,我的真实世界查询就是这样的受害者你能选择一个临时表并将其用于插入吗?我疯了吗?还是你简化了这一点以避免真正的问题;不明显?您不需要输出documentid,它已经存储在变量中。
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