这主要是一个好奇心问题。我刚刚经历过这样一种情况:在测试数据库中我有以下查询:
update table
set column1 = 1
where column2 in (1,2)
但是这继续执行子查询返回多个值的错误。
现在我检查确保我没有多个身份密钥或'in'值是唯一的。因此,对于所有意图和目的,这不应该发生。
检查数据库的LIVE副本,同一查询没有问题。因此,最后,我的问题是:
您可以对创建此类场景的Microsoft SQL Server设置或数据库结构做些什么?
答案 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 强>
当只有一行受到影响时,一切正常。