Microsoft SQL Server-限制子查询

Microsoft SQL Server-限制子查询,sql,sql-server,tsql,subquery,Sql,Sql Server,Tsql,Subquery,这主要是一个好奇的问题。我刚刚经历了一种情况,在测试数据库中,我遇到了以下查询: update table set column1 = 1 where column2 in (1,2) 但它继续执行,错误是子查询返回了多个值 现在我检查以确保没有多个标识键,或者“in”值是唯一的。因此,无论出于何种目的,这都不应该发生 在检查数据库的实时副本时,同一查询没有问题。因此,最后,我的问题是: 您可以对Microsoft SQL Server设置或数据库结构做些什么来创建这样的场景 您可以对Mi

这主要是一个好奇的问题。我刚刚经历了一种情况,在测试数据库中,我遇到了以下查询:

update table 
set column1 = 1 
where column2 in (1,2)
但它继续执行,错误是子查询返回了多个值

现在我检查以确保没有多个标识键,或者“in”值是唯一的。因此,无论出于何种目的,这都不应该发生

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

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

您可以对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,16级,状态1,程序训练选项卡i,第5行[批次起始行19]

子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时。


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

您的表上有更新触发器吗?我猜是的,它假设
插入的
删除的
中只有一行。。。遇到PK冲突的唯一方法是列1是复合PK或PK本身的一部分。查询似乎很简单:如果在同一元组的column2中找到值(1)或(2),则更新column1并将其设置为(1)。我猜您的测试数据库与您的产品有不同的开始记录。你能把生产值复制到你的测试数据库并再次运行吗?@Milan你是如何从“子查询返回多个值”变为“PK违规”的?啊,有人编辑了原始帖子吗?那我一定是完全误解了这个问题。很抱歉。是的,触发器肯定会导致这种情况。我还想知道在第二列中会发生什么,第二列是计算列,对第一列有一些依赖性。。。?我需要试试:)谢谢。事实证明,我们的软件供应商正在测试一个定制功能的触发器,我不知道它进入了我们的测试数据库。(我的同事意识到了这一点,但他从未想到这是一个错误的触发器)
UPDATE tab
SET column1 = 1 
WHERE column2 in (1);
-- (1 row(s) affected)
-- (1 row(s) affected)