Композиционная ошибка DML - PullRequest
       0

Композиционная ошибка DML

0 голосов
/ 16 декабря 2011

У меня есть следующий составной 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'. (* в последней строке)

Целевая таблица 'order_kit' оператора INSERT не может находиться ни по одной из сторон отношения (первичный ключ, внешний ключ), когда предложение FROM содержит вложенный оператор INSERT, UPDATE, DELETE или MERGE. Найдено ссылочное ограничение 'FK_order_kit_order'.

Ответы [ 3 ]

2 голосов
/ 16 декабря 2011

Трудно догадаться, когда вы не предоставили определения таблиц, но я думаю, что первая ошибка заключается в том, что у вас неквалифицированный kit_no.Сделайте это

SELECT TOP 2 rk.kit_no

и посмотрите, что произойдет.

Кроме того, я думаю, что вторая ошибка будет очевидной.

1 голос
/ 16 декабря 2011

Вы должны квалифицировать kit_no в условии вывода.

OUTPUT $action as action, src.kit_no

Я на самом деле не понимаю, как вы можете получить обе ошибки. SQL Server обычно просто жалуется на один запрос за раз.

Вторую проблему можно решить, создав вместо нее переменную таблицы you 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
  ...
0 голосов
/ 20 декабря 2011

Мне удалось решить эту проблему с помощью

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...