Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有用户定义类型的SQL语句产生错误_Sql_Sql Server_User Defined Types - Fatal编程技术网

具有用户定义类型的SQL语句产生错误

具有用户定义类型的SQL语句产生错误,sql,sql-server,user-defined-types,Sql,Sql Server,User Defined Types,我创建了一个名为membertypes的用户定义类型,它由一列类型为int的membertype组成 我有这样一个存储过程: declare @membertypes dbo.MemberTypes; INSERT INTO @membertypes VALUES (1); INSERT INTO @membertypes VALUES (3); declare @membertypecount int = (select cou

我创建了一个名为
membertypes
的用户定义类型,它由一列类型为
int
membertype
组成

我有这样一个存储过程:

        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)
它不工作,我收到错误消息:

子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时

但是,如果我将代码更改为此,它确实可以工作:-

        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表达式将只返回一个单行值,而子查询可能有多行。所以,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);
为什么原始代码会产生这种错误

这是无效的:

case when @membertypecount > 0 then (select membertype from @membertypes) else members.membertype end
                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
情况下,当x然后y
时,
y
必须表示一个值,如
1
“苹果”
等。在若干组数据中选择一组输入In时,使用CASE无效。

这是您的逻辑:

   where members.membertype in (case when @membertypecount > 0 
                                     then (select membertype from @membertypes)
                                     else members.membertype 
                                 end)
您误解了
案例
表达式的含义。
大小写表达式是返回单个标量值的表达式。“标量”值具有简单类型,例如整数或字符串。(一些数据库将其扩展为包括元组和数组,但SQL Server不是其中之一。)表达式的其他示例包括算术(
'1+1'
)、函数(
len('abc')
),甚至是简单列

子查询并不简单

幸运的是,没有
案例
,您想做的事情很容易:

where members.membertype in (select membertype from @membertypes) or
      not exists (select 1 from @membertypes)

请注意,提供一些有用的东西并不是解决这个问题的答案;他已经有了一些有用的东西(
中的
),他想知道为什么使用
=
不行work@CaiusJard. . . <代码>真
。但是,中的
不会做可能不
OP
想要的事情<
中的code>将只过滤匹配的行,如果不过滤,则查询将不返回任何行。@CaiusJard好的,但为什么它在第二段代码中工作?对不起,我一直在以
=
为例进行解释,当子查询用作表达式时,我本应该关注
,但推理是一样的:
如果x那么y只能用于返回一个值作为y。放置一个返回多个值的查询无法工作。如果子查询是
selectmax
selecttop1
,SQLserver会允许它go@CaiusJardbut我使用的是“in”语句,所以它肯定是为了处理多个结果而设计的?