C# 可组合DML错误

C# 可组合DML错误,c#,sql,sql-server-2008,C#,Sql,Sql Server 2008,我有以下可组合的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 =

我有以下可组合的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或MERGE语句时,INSERT语句的目标表“order_kit”不能位于(主键、外键)关系的任一侧。找到引用约束“FK\U order\U kit\U order”。

很难猜测您何时没有提供表定义,但我猜第一个错误是因为您有一个不合格的
kit\U no
。成功

SELECT TOP 2 rk.kit_no
看看会发生什么


另外,我认为第二个错误是显而易见的。

很难猜测您何时没有提供表定义,但我猜第一个错误是因为您有一个不合格的
工具包。\u no
。成功

SELECT TOP 2 rk.kit_no
看看会发生什么


另外,我认为第二个错误很明显。

您必须在输出子句中限定
kit\u no

OUTPUT $action as action, src.kit_no
我真的不明白你怎么会同时犯这两个错误。SQLServer通常一次只对一个查询抱怨一件事

您可以通过创建一个表变量来解决第二个问题,将
输出改为
,并使用该表变量作为源,将行插入到
order\u 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
  ...
更新

您可以使用update而不是merge来简化这一点,并将输出直接输入到
order\u 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
  ...

您必须在output子句中限定
kit\u no

OUTPUT $action as action, src.kit_no
我真的不明白你怎么会同时犯这两个错误。SQLServer通常一次只对一个查询抱怨一件事

您可以通过创建一个表变量来解决第二个问题,将
输出改为
,并使用该表变量作为源,将行插入到
order\u 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
  ...
更新

您可以使用update而不是merge来简化这一点,并将输出直接输入到
order\u 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
  ...

我通过使用

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

我通过使用

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