2017-08-08 46 views
1

这主要是一个好奇的问题。我刚刚经历了一个情况,即测试数据库上,我有以下查询:Microsoft SQL Server - 限制子查询

update table 
set column1 = 1 
where column2 in (1,2) 

但这跟上错误执行该子查询返回多个值。

现在我检查以确保我没有多个身份密钥或'in'值是唯一的。所有的意图和目的都不应该发生。

检查数据库的LIVE副本,同样的查询没有问题。因此,最后,我的问题是:

您可以对Microsoft SQL Server设置或数据库结构进行哪些操作来创建此类方案?

+12

你的表是否有更新触发器?我猜测它的确如此,并且它假定“插入”或“删除”只有一行。 –

+0

所以......你应该碰到PK违规的唯一方法是如果Column1是复合PK或PK本身的一部分。查询看起来很简单:如果在同一元组的column2中发现值(1)或(2),请更新column1并将其设置为(1)。我猜测你的测试数据库有你的产品不同的起始记录。你可以将生产值复制到测试数据库并再次运行? – Milan

+0

@Milan你是如何从“子查询返回多个值”到“PK违规”的? – HABO

回答

2

对于创建这种场景的Microsoft SQL Server设置或数据库结构,您可以做些什么?

正如评论中提到的,你可能写的触发器写得很差。示例场景:

CREATE TABLE aud(column2 INT, comment NVARCHAR(150)); 
CREATE TABLE tab(column1 INT, column2 INT); 

INSERT INTO aud(column2) VALUES (1),(2),(3); 
INSERT INTO tab(column1, column2) VALUES (0,1),(-1, 2), (-2,3); 
GO 

CREATE TRIGGER trg_tab_i ON tab 
FOR UPDATE 
AS 
BEGIN 
    UPDATE aud 
    SET comment = 'Changed value ...' 
    WHERE column2 = (SELECT column2 FROM inserted); 
END 
GO 


UPDATE tab 
SET column1 = 1 
WHERE column2 in (1,2); 

消息512,级别16,状态1,过程trg_tab_i,5号线[批量起始行19]

子查询返回多个值。当子查询遵循=,!=,<,< =,>,> =或当子查询用作表达式时,这是不允许的。

UPDATE tab 
SET column1 = 1 
WHERE column2 in (1); 
-- (1 row(s) affected) 
-- (1 row(s) affected) 

DBFiddle Demo

当只有一行受到影响,一切正常。

+1

谢谢。事实证明,我们的软件供应商正在测试自定义功能的触发器,但我并没有意识到它已将其传递给我们的_test DB。 (我的同事知道这一点,但他从来没有想过这是一个错误的触发器) – EkeshOkor