Microsoft SQL Server - 限制子查询

时间:2017-08-08 18:31:00

标签: sql sql-server tsql subquery

这主要是一个好奇心问题。我刚刚经历过这样一种情况:在测试数据库中我有以下查询:

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

但是这继续执行子查询返回多个值的错误。

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

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

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

1 个答案:

答案 0 :(得分: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);
  

Msg 512,Level 16,State 1,Procedure trg_tab_i,Line 5 [Batch Start Line 19]

     

子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。

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

<强> DBFiddle Demo

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