Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何插入省略约束的记录_Sql Server_Tsql_Sql Server 2012 - Fatal编程技术网

Sql server 如何插入省略约束的记录

Sql server 如何插入省略约束的记录,sql-server,tsql,sql-server-2012,Sql Server,Tsql,Sql Server 2012,我在存储过程中有此查询: 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 检查表上有主键约束(audit、QType、QNmbr、ANmbr)

我在存储过程中有此查询:

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
检查表上有主键约束(
audit、QType、QNmbr、ANmbr

在问题表中,有多条记录在问题表中具有相同的显示顺序,用于少数导致插入失败的
问题。Q_type
。其中只有一个(任何人,但最好是前1名)需要进入检查表。
查询是否有任何方法可以跳过约束并插入其余记录。或者我可以在insert中修改select子句吗?我也试过了,但没有成功。SELECT可能会为问题表中的同一显示顺序调出多条记录,并尝试一次插入这些记录。

在插入之前,您应该过滤错误的数据

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,也许只使用一个增量列。

主键是用来保持数据干净并防止重复的,所以最好不要试图绕过它。看看你的选择,你就快到了,只需做一些调整:

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
  )

“重新考虑你的PK”-解释和证明。这本身只是增加了复杂性。并且添加合成密钥不会否定强制使用自然密钥的需要。鉴于这个名称,我怀疑这个表不是一个热点,因此作为PK的标识列似乎没有提供太多(如果有的话)好处。我相信这是因为“不存在”是真的,但select(select DISTINCT@AUDITED…)会调出2到3条记录,并尝试一次性插入它们。