2010-05-14 52 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