语句错误时的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案例的主要内容,如果未能解决你的问题,请参考以下文章