2011-12-16 46 views
0

我有以下可組合的dml,我似乎無法設置它的工作。有人能幫我指出我出錯的地方嗎?可組合的DML錯誤

INSERT INTO order_kit (kit_no, order_id) 
SELECT 
    X.kit_no, 10089 
FROM 
    (
    MERGE INTO kit AS tgt 
    USING 
     (SELECT TOP 2 kit_no 
     FROM kit rk, batch rb 
     WHERE rk.study_id = 35 AND 
     rk.batch_id = rb.batch_id AND 
     rb.depot_id = 16 AND 
     rk.treatment = 1 AND 
     rk.status = 1 AND 
     rb.status = 1 AND 
     rb.expiry > CAST(FLOOR(CAST(getdate() AS float)) AS datetime) 
     ) AS src ON tgt.kit_no = src.kit_no 
     WHEN MATCHED THEN 
      UPDATE SET status = 6 OUTPUT $action as action, kit_no) AS X 

無效的列名'kit_no'。 (*在最後一行)

當FROM子句包含嵌套的INSERT,UPDATE,DELETE或INSERT語句時,INSERT語句的目標表'order_kit'不能位於(主鍵,外鍵)關係的任一側MERGE聲明。找到參考約束'FK_order_kit_order'。

回答

0

我設法解決這個使用

INSERT INTO order_kit (kit_no, order_id) 
SELECT 
    X.kit_no, 10089 
FROM 
    (
    MERGE INTO kit AS tgt 
    USING 
     (SELECT TOP 2 kit_no 
     FROM kit rk, batch rb 
     WHERE rk.study_id = 35 AND 
     rk.batch_id = rb.batch_id AND 
     rb.depot_id = 16 AND 
     rk.treatment = 1 AND 
     rk.status = 1 AND 
     rb.status = 1 AND 
     rb.expiry > CAST(FLOOR(CAST(getdate() AS float)) AS datetime) 
     ) AS src ON tgt.kit_no = src.kit_no 
     WHEN MATCHED THEN 
      UPDATE SET status = 6 OUTPUT $action as action, **tgt.kit_no**) AS X 
2

當你沒有提供你的表格定義很難猜出,但我猜想第一個錯誤是因爲你有一個不合格的kit_no。做它

SELECT TOP 2 rk.kit_no 

看看會發生什麼。

另外,我會認爲第二個錯誤是顯而易見的。

1

您必須在輸出子句中限定kit_no

OUTPUT $action as action, src.kit_no 

我其實不明白你怎麼能得到這兩個錯誤。 SQL Server通常只是在一次查詢中抱怨一件事。

您可以通過創建一個表變量來代替output into來解決第二個問題,並將該表變量用作將行插入到order_kit的源。

更新

可以簡化這個有點用更新的合併而不是直接做輸出到order_kit

update top (2) rk 
set [status] = 6 
output inserted.kit_no, 10089 into order_kit(kit_no, order_id) 
from kit as rk 
    inner join batch as rb 
    on rk.batch_id = rb.batch_id 
where 
    ...