Как вставить записи без ограничений - PullRequest
0 голосов
/ 27 апреля 2019

У меня есть этот запрос в хранимой процедуре:

INSERT INTO Checklist (AuditID, QType, Question, QNmbr, QID, ANmbr)  
    SELECT @AuditID, @QType, Question, displayorder AS QNmbr, id AS QID, 0 AS ANmbr 
    FROM Questions 
    WHERE Q_type = @QType

Существует ограничение первичного ключа для таблицы контрольных списков (AuditID, QType, QNmbr, ANmbr)

В таблице вопросов есть несколько записей с одинаковым displayOrder в таблице вопросов для немногих из Questions.Q_type, что приводит к сбою вставки. Только один из них (любой, но желательно ТОП-1) должен попасть в таблицу контрольных списков. Есть ли способ, чтобы запрос мог пропустить ограничения и вставить остальные записи. Или я могу изменить свое предложение select в insert? Я тоже пытался безуспешно. SELECT извлекает более одной записи, вероятно, для одного и того же displayOrder в таблице вопросов, и может попытаться вставить их сразу.

Ответы [ 2 ]

1 голос
/ 27 апреля 2019

Вы должны отфильтровать неверные данные перед вставкой

INSERT INTO Checklist (AuditID, QType, Question, QNmbr, QID, ANmbr)  
  SELECT @AuditID, @QType, Question, displayorder AS QNmbr, id AS QID, 0 AS ANmbr 
  FROM Questions Q 
  left join Checklist C on C.AuditID = @AuditID and c.QType = @QType and C.QNmbr = Q.displayorder and ANmbr = 0
  WHERE Q_type = @QType and c.AuditID is null

, и я предлагаю вам пересмотреть ваш PK, возможно, просто используйте один инкрементный столбец.

0 голосов
/ 27 апреля 2019

Первичный ключ предназначен для поддержания чистоты ваших данных и предотвращения дублирования, поэтому лучше не пытаться обойти это.Глядя на ваш выбор, вы почти там, просто пара настроек:

INSERT INTO Checklist (AuditID, QType, Question, QNmbr, QID, ANmbr)  
  SELECT DISTINCT @AuditID, @QType, Question, displayorder AS QNmbr, id AS QID, 0 AS ANmbr
  FROM Questions Q
  WHERE Q_type = @QType
  AND NOT EXISTS
  (
    SELECT TOP 1 1
    FROM Checklist CL
    WHERE CL.AuditID = @AuditID 
    and CL.QType = @QType 
    AND CL.QNmbr = Q.displayorder
    AND CL.ANmbr = 0
  )
...