语句错误时的MSSQL案例

问题描述 投票:0回答:1

我正在研究MSSQL中的触发器,我收到此错误消息:

Msg 512,Level 16,State 1,Procedure TirregerUpdate,Line 11 [Batch Start Line 0] 子查询返回的值超过1。当子查询跟随=,!=,<,<=,>,> =或子查询用作表达式时,不允许这样做。该语句已终止。

这些是我的sql代码:

Declare @NAME varchar(255) = 'ONE';
Declare @MKOD varchar(255);
Declare @OMKOD varchar(255);
DECLARE @STATUS BIT = 0;


IF @STATUS = 1
BEGIN
    SET @MKOD = CASE @NAME
        WHEN 'ONE' THEN '1'
        WHEN 'TWO' THEN '2'
        WHEN 'TRHEE' THEN '3'
    END
    SET @OMKOD = CASE @NAME
        WHEN 'ONE' THEN '1 - ONE'
        WHEN 'TWO' THEN '2 - TWO'
        WHEN 'TRHEE' THEN '3 - TRHEE'
    END
END
ELSE
BEGIN
    SET @MKOD = CASE @NAME
        WHEN 'ONE' THEN '1 - ONE'
        WHEN 'TWO' THEN '2 - TWO'
        WHEN 'TRHEE' THEN '3 - TRHEE'
    END
    SET @OMKOD = CASE @NAME
        WHEN 'ONE' THEN '1'
        WHEN 'TWO' THEN '2'
        WHEN 'TRHEE' THEN '3'
    END
END

UPDATE PRODUCT SET MKOD = @MKOD WHERE MKOD = @OMKOD;

你能帮我解决这个问题。谢谢..

sql-server triggers case
1个回答
1
投票

虽然你没有发布整个触发器代码(并且你真的应该有),但是“子查询返回了超过1个值...”错误消息,通常在触发器中(在我见过的超过90%的情况下)表示您的触发器无法处理影响多行的语句。

这是一个非常常见的错误,几乎每个人在编写他们的第一个触发器(包括我自己)时都会犯这个错

在SQL Server中,每个语句触发触发器,而不是每行触发。 这意味着插入和删除的伪表可能包含0行,1行或多行 - 并且在编写触发器时,必须考虑到这一点。

我愿意打赌,在触发器的某个地方,你有类似的东西

SET @Variable = (SELECT ColumnName FROM Inserted)

这通常是问题的原因。

© www.soinside.com 2019 - 2024. All rights reserved.