语句错误时的MSSQL案例

时间:2018-03-05 07:57:31

标签: sql-server triggers case

我正在研究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;

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

SET @Variable = (SELECT ColumnName FROM Inserted)

这通常是问题的原因。