使用存储过程在“In”子句中传递多个值时查询不返回数据

Posted

技术标签:

【中文标题】使用存储过程在“In”子句中传递多个值时查询不返回数据【英文标题】:Query not returning data while multiple values passing in "In" Clause using stored procedure 【发布时间】:2018-07-03 14:20:21 【问题描述】:

这是我的代码:

declare @data nvarchar(max) = 'AA1,AA2,AA3'
set @data = replace(@data, ',', ''',''')
set @data = ' ''' + @data + ''' '

select @data

select * 
from tbl_Member 
where memberName in (@data)

我将 'AA1,AA2,AA3' 发送到 @data,它返回 'AA1','AA2','AA3'

IN 子句中使用返回的数据时,我没有从表中获取数据。

请帮助我,提前谢谢。

【问题讨论】:

【参考方案1】:

我理解为什么你会认为这会起作用,但解析器不会将你的语法读取为文字。这里应该使用表参数,可以避免动态sql。

declare @data table(datas varchar(16))
insert into @data
values
('AA1'),
('AA2'),
('AA3')



declare @tbl_Member table (memberName varchar(64))
insert into @tbl_Member

values
('AA1'),
('AA2'),
('AA3'),
('AA4')

select * 
from @tbl_Member 
where memberName in (select * from @data)

【讨论】:

当然@QWTest【参考方案2】:

试试这个

declare @data nvarchar(max) = 'AA1,AA2,AA3'
set @data = replace(@data, ',', ''',''')
set @data = ' ''' + @data + ''' '
DECLARE @query varchar(1024)
set @query = 'select * from tbl_Member where memberName in (' + @data + ')';
exec(@query)

【讨论】:

【参考方案3】:

试试这个。

declare @data nvarchar(max) = 'AA1,AA2,AA3'
set @data = replace(@data, ',', ''',''')
set @data = ' ''' + @data + ''' '

select @data

EXEC('
select * 
from tbl_Member 
where memberName in ('+@data+')')

【讨论】:

以上是关于使用存储过程在“In”子句中传递多个值时查询不返回数据的主要内容,如果未能解决你的问题,请参考以下文章

在存储过程 (MySQL) 上使用 WHERE IN

使用 WHERE IN SQL 子句将字符串值从单个值拆分为多个值以获取数据

带有 IN 子句参数的 Oracle 存储过程

在MySQL存储过程中的WHERE子句中使用IN param

如何将 select 语句的 IN 子句中的参数作为具有多个值的参数传递?

mysql IN子句不使用可能的键