语句错误时的MSSQL案例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了语句错误时的MSSQL案例相关的知识,希望对你有一定的参考价值。

我正在研究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个值...”错误消息,通常在触发器中(在我见过的超过90%的情况下)表示您的触发器无法处理影响多行的语句。

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

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

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

SET @Variable = (SELECT ColumnName FROM Inserted)

这通常是问题的原因。

以上是关于语句错误时的MSSQL案例的主要内容,如果未能解决你的问题,请参考以下文章

使用 MINUS Snowflake DB 时的案例语句错误

MSSQL之try Catch的用法通俗讲解

Microsoft SQL Server 代码片段收集

MSSQL 2000 错误823恢复数据案例

数据恢复案例分享:MSSQL 2000 错误823

IS NULL 时的 SQL Server 案例语句