代码之家  ›  专栏  ›  技术社区  ›  lance

输出列不在目标表中?

  •  3
  • lance  · 技术社区  · 14 年前

    总结:
    我需要使用 OUTPUT clause 关于一个 INSERT 语句返回我要插入的表中不存在的列。如果我能避开它, 我不想在要插入的表中添加列 .

    细节:
    我的finishedDocument表只有一列。这是我要插入的表。

    完成的文档
    --文档

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

    文件
    --文档
    ——描述

    下面将在finishedDocument中插入一行。它的output子句返回插入的documentID。这是可行的,但它没有给出插入文档的描述。

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

    我要回去 从文档表 插入中匹配文档的documentID和说明。

    我需要什么语法来完成这个?我认为只有一个insert语句才有可能,通过调整output子句(在某种程度上我显然不理解)?

    有没有一种更聪明的方法,不象我要走的路?

    编辑: SQL Server 2005

    6 回复  |  直到 14 年前
        1
  •  2
  •   Cade Roux    14 年前

    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
    
        2
  •  1
  •   SqlRyan    14 年前

    我想知道你是否可以这样做(我真的会考虑这样做吗?):

    ;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子句,但是作为一个内联表,它随后链接到文档以获取所需的信息。但是,由于某种原因,我无法摆脱这种感觉,这种混蛋与条款绝望地…

        3
  •  1
  •   marc_s    14 年前

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

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

        4
  •  0
  •   ChrisLively    14 年前

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

        5
  •  0
  •   nvogel    14 年前

    在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;
    

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

    值得吗?您只是从一个变量中插入,所以有两个语句(一个用于选择,一个用于插入)不会给您带来额外的开销。使用两个语句。

        6
  •  0
  •   Joe Stefanelli    14 年前

    像这样的怎么样?

    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
    
    推荐文章