SQL 具有用户定义类型的语句产生错误
SQL statement with user defined type produces error
我创建了一个名为 membertypes
的用户定义类型,它包含一列名为 membertype
、
的 int
类型
我有一个这样的存储过程:
declare @membertypes dbo.MemberTypes;
INSERT INTO @membertypes VALUES (1);
INSERT INTO @membertypes VALUES (3);
declare @membertypecount int = (select count(1) from @membertypes)
select username, MiniThumbNail, userID,
from members
where members.membertype in (case when @membertypecount > 0 then (select membertype from @membertypes) else members.membertype end)
它不起作用,我收到错误消息:
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
但是,如果我将代码更改为此它确实有效:-
declare @membertypes dbo.MemberTypes;
INSERT INTO @membertypes VALUES (1);
INSERT INTO @membertypes VALUES (3);
select username, MiniThumbNail, userID,
from members
where members.membertype in (select membertype from @membertypes)
为什么原始代码会产生该错误?
case
表达式将 return 只有一个值,单行,而子查询可能有多行。所以,case 表达式将不起作用
因此,您可以使用 left join
代替:
select username, MiniThumbNail, userID
from members mb left join
@membertypes mt
on mt.membertype = mb.membertype
where (@membertypecount = 0 or mt.membertype is not null);
Why does the original code produce that error?
这是无效的:
case when @membertypecount > 0 then (select membertype from @membertypes) else members.membertype end
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
在 CASE WHEN x THEN y
中,y
必须表示单个值,如 1
、'apple'
等。在多个 CASE WHEN 中进行选择是无效的要输入 IN 的数据集。
这是你的逻辑:
where members.membertype in (case when @membertypecount > 0
then (select membertype from @membertypes)
else members.membertype
end)
您误解了 case
表达式的含义。 case
表达式是 returns 单个标量值的表达式。 "scalar" 值具有简单类型,例如整数或字符串。 (一些数据库将其扩展为包括元组和数组,但 SQL Server 不是其中之一。)表达式的其他示例是算术 ('1 + 1'
)、函数 (len('abc')
),甚至简单的列。
子查询不简单
幸运的是,没有case
你想做的事很容易:
where members.membertype in (select membertype from @membertypes) or
not exists (select 1 from @membertypes)
我创建了一个名为 membertypes
的用户定义类型,它包含一列名为 membertype
、
int
类型
我有一个这样的存储过程:
declare @membertypes dbo.MemberTypes;
INSERT INTO @membertypes VALUES (1);
INSERT INTO @membertypes VALUES (3);
declare @membertypecount int = (select count(1) from @membertypes)
select username, MiniThumbNail, userID,
from members
where members.membertype in (case when @membertypecount > 0 then (select membertype from @membertypes) else members.membertype end)
它不起作用,我收到错误消息:
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
但是,如果我将代码更改为此它确实有效:-
declare @membertypes dbo.MemberTypes;
INSERT INTO @membertypes VALUES (1);
INSERT INTO @membertypes VALUES (3);
select username, MiniThumbNail, userID,
from members
where members.membertype in (select membertype from @membertypes)
为什么原始代码会产生该错误?
case
表达式将 return 只有一个值,单行,而子查询可能有多行。所以,case 表达式将不起作用
因此,您可以使用 left join
代替:
select username, MiniThumbNail, userID
from members mb left join
@membertypes mt
on mt.membertype = mb.membertype
where (@membertypecount = 0 or mt.membertype is not null);
Why does the original code produce that error?
这是无效的:
case when @membertypecount > 0 then (select membertype from @membertypes) else members.membertype end
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
在 CASE WHEN x THEN y
中,y
必须表示单个值,如 1
、'apple'
等。在多个 CASE WHEN 中进行选择是无效的要输入 IN 的数据集。
这是你的逻辑:
where members.membertype in (case when @membertypecount > 0
then (select membertype from @membertypes)
else members.membertype
end)
您误解了 case
表达式的含义。 case
表达式是 returns 单个标量值的表达式。 "scalar" 值具有简单类型,例如整数或字符串。 (一些数据库将其扩展为包括元组和数组,但 SQL Server 不是其中之一。)表达式的其他示例是算术 ('1 + 1'
)、函数 (len('abc')
),甚至简单的列。
子查询不简单
幸运的是,没有case
你想做的事很容易:
where members.membertype in (select membertype from @membertypes) or
not exists (select 1 from @membertypes)