【问题标题】:MSSQL Case When Statement Error语句错误时的 MSSQL 案例
【发布时间】:2018-03-05 07:57:31
【问题描述】:

我正在使用 MSSQL 中的触发器并收到以下错误消息:

消息 512,级别 16,状态 1,过程 TirregerUpdate,第 11 行 [批处理开始行 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 代码中没有看到任何子查询。
  • 这是真实的代码还是示例?因为那里没有任何错误。 dbfiddle.uk/…
  • 是的,它真正的代码博客。我想将 '1 - ONE' 更改为 '1''1' 更改为 '1 - ONE'
  • 您的代码完美无误。请发布产生错误的代码

标签: sql-server triggers case


【解决方案1】:

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

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

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

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

SET @Variable = (SELECT ColumnName FROM Inserted)

这通常是问题的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多