Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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 server 在Sql Server中添加Dyanmic In()条件_Sql Server - Fatal编程技术网

Sql server 在Sql Server中添加Dyanmic In()条件

Sql server 在Sql Server中添加Dyanmic In()条件,sql-server,Sql Server,SQL Server查询生成面临的问题 在下面的查询中,添加了动态条件来检查值是否为null Select * From tblEmployees where EmployeeName = Case When @EmployeeName Is Not Null Then @EmployeeName

SQL Server查询生成面临的问题 在下面的查询中,添加了动态条件来检查值是否为null

Select  * 
From    tblEmployees 
where   EmployeeName =  Case 
                            When @EmployeeName Is Not Null 
                                Then @EmployeeName 
                            Else EmployeeName 
                        End 
但是我需要添加IN()条件,IN()中的参数with也可以为null或空,如果传递给IN条件的参数/字符串为空,那么我不想在查询中添加该条件

那么我怎样才能做到这一点呢?伸出援助之手对我来说是非常有用的

感谢和问候,
D.Mahesh

根据参数的值(not为空),可以相应地创建SQL字符串

DECLARE @sqlCommand VARCHAR(1000)
IF(ISNULL(@YourParameter,'')='')
    @sqlCommand = 'your query goes here'
ELSE
    @sqlCommand = 'your query goes here'
然后,使用动态查询执行来运行它

EXEC (@sqlCommand)
如果不是动态查询,那么

SELECT ....
FROM ....
WHERE CASE WHEN ISNULL(@YourParameter,'')='' THEN '' ELSE EmployeeName END IN (ISNULL(@YourParameter,''))

看看这是否有效…

我认为动态查询是最好的解决方案,但是您可以将“is NULL”和“is BLANK”条件放在中的in子句中

诸如此类

Select  * 
From    tblEmployees 
where   @EmployeeName is null or EmployeeName in (@EmployeeName)

当@EmployeeName为null时,您的IN子句将被忽略

如果我做对了,您有
@EmployeeName='Name1,Name2,Name3'
,并且您希望获取名为Name1或Name2或Name3的员工,变量
@EmployeeName
可以是
null
或包含空字符串

您可以在
上拆分字符串
@EmployeeName
并将其存储在表变量或临时表中,而不必在
中使用
。然后,您可以在针对
tblEmployees
的联接中使用该表来获取所需的行

在S.O.有很多关于如何分割字符串的帖子。这是一个最新的变体。

这适用于SQL Server 2005或更高版本

declare @EmployeeName varchar(100) = 'Name2,Name3,Name5'

-- Null or empty will have a comma
set @EmployeeName = coalesce(@EmployeeName, '') + ','

-- cteNames splits the string to rows
;with cteNames
as
(
  select
    left(@EmployeeName, charindex(',', @EmployeeName)-1) as Name,
    right(@EmployeeName, len(@EmployeeName)-charindex(',', @EmployeeName)) as EmployeeName
  union all
  select
    left(EmployeeName, charindex(',', EmployeeName)-1) as Name,
    right(EmployeeName, len(EmployeeName)-charindex(',', EmployeeName)) as EmployeeName
  from cteNames
  where charindex(',', EmployeeName) > 1
)
select E.*
from tblEmployees as E
  inner join cteNames as N
    on E.Name = N.Name or
       @EmployeeName = ','

-- @EmployeeName = ',' will give you all names when @EmployeeName is null of empty

你说的要求有点不清楚。请你再解释一下IN子句。嗨,Anil,谢谢你的回复,但是如果我不想在这种情况下创建动态查询,我该怎么做呢?i,谢谢你的回复,我尝试了你的方法,但是通过下面的示例,但仍然没有得到结果Declare@EmployeeName VARCHAR(500)--set@EmployeeName='''test1'',''test2''set@EmployeeName='''nishap'--set@EmployeeName=null--set@EmployeeName=''从STBStg.StgUserFilter中选择*,当CASE为null(@EmployeeName,'')=''时,其他用户名以(@EmployeeName)@Mahesh结尾:尝试从@EmployeeName中删除引号。它应该是“test1,test2”,我已经设置了像这样的值Declare@EmployeeName VARCHAR(500)set@EmployeeName=“test1,test2”,并运行上面的查询,它给了我错误-无效的列名“test1,test2”。否则,只需输入IF条件并编写两个单独的查询-一个IF为空,另一个在else部分使用in子句hi,我尝试了您的方法,但它没有给我适当的结果下面是我尝试声明@EmployeeName VARCHAR(500)--设置@EmployeeName=''test1'',''test2''作为通讯值的代码,如果它不是工作集@EmployeeName=''nishap'--set@EmployeeName=null--set@EmployeeName=''exece('Select*From STBStg.StgUserFilter,其中(+@EmployeeName+')为空或('+@EmployeeName+')中的用户名)@Mahesh:看起来你在这里使用的是动态查询。如果是这样,为什么要在
WHERE
子句中添加空条件呢?如果
@EmployeeName
为空,只需不添加WHERE子句,如果不为空,只需将其添加为
“…WHERE EmployeeName in(+@EmployeeName+”)“
@Mahesh:另一方面,如果你想避免动态查询,正如你在别处评论的那样,那么你不能使用
@EmployeeName
作为
的项目列表,在那里只能将
@EmployeeName
视为单个字符串值。我同意Andriy M。但是如果你需要在IN claus中使用一个参数e您必须创建一个过程来将其拆分为一个列表,因为TSQL不支持数组类型变量(据我所知).嗨,安德烈,谢谢你的回复,因为如果我避免动态查询,我就不可能在中发送项目列表。我同意你的观点,所以我会继续动态查询,但仍然不会在动态查询中获取项目列表。这里是场景Declare@EmployeeName VARCHAR(500)设置@EmployeeName=''nishap'',''mihir''EXEC('从STBStg.StgUserFilter中选择*,其中filtertype=''AccountFilter''和(+@EmployeeName+')为null或('+@EmployeeName+')中的用户名),如果传递了单个值,则它可以工作,但不能用于多个值(项目列表)您好,Mikael,谢谢您的工作非常好,但是如果我需要在条件中添加这样的4-5,这意味着我需要创建4-5个内部联接,这不会使我的查询变慢。我无法对您的系统中的性能发表任何意见。这取决于您的表中有多少数据以及其中有哪些索引等。