我有以下sql查询
Select * from Name
where surname in ('test1', 'test2')
哪个有效
但我想做以下
DECLARE @Surname as VARCHAR(100)
set @Surname = 'test1' + ',' + 'test2'
Select * from Name
where surname in @Surname
这是使用的实际查询
DECLARE @COESNo as VARCHAR(100)
set @COESNo = '121108883' + ',' + '121108890'
declare @sql varchar(max)
set @sql = 'select [LEI_ACCEPT] , [PREFERED_LEI] , [INSPECTION_COMPANY], [INSP_ACCEPT] from [CERTIFICATE_DETAILS] where [Certificate_no] in ('
set @sql = @sql + @COESNo + ')'
exec @sql
得到错误
The name 'select [LEI_ACCEPT] , [PREFERED_LEI] , [INSPECTION_COMPANY], [INSP_ACCEPT] from [CERTIFICATE_DETAILS] where [Certificate_no] in (121108883,121108890)' is not a valid identifier.
似乎无法正常工作
任何想法
答案 0 :(得分:2)
有两种流行的解决方案。
首先是使用查询构建字符串并使用sp_executesql来运行它。
第二个是编写(或查找)函数(类似SplitText2Table()
),它将逗号分隔的字符串转换为表和使用此函数的写查询 - 类似于:
select *
from name
where surname in (select item from SplitText2Table(@surnames))
答案 1 :(得分:0)
这不是问题中确切问题的解决方案。但也许(?)你可以改为使用这种解决方法:
declare @SurName1 nvarchar(20)
declare @SurName2 nvarchar(20)
set @SurName1='test1'
set @SurName2='test2'
select * from [Name] where [surname] in (@SurName1, @SurName2)
答案 2 :(得分:-1)
你需要创建你的语句并执行 - 比如
declare @sql varchar(max)
set @sql = 'Select * from [Name] where surname in ('
set @sql = @sql + @surname + ')'
创建声明后,只需说出
exec @sql
您还可以使用print
print @sql
请在执行命令之前使用print(这将帮助您纠正查询是否有任何错误。)。
修改强>: 根据评论 - 由于Name是SQL的关键字 - 我们需要使用方括号。我在答案中修改了这句话。
编辑2 :根据进一步的评论 -
首先,我想知道数据库中Certificate_no
列的数据类型。
如果是varchar
字段,则需要在每个值周围加上单引号。
名称SELECT [LEI_ACCEPT] , [PREFERED_LEI] , [INSPECTION_COMPANY], [INSP_ACCEPT] FROM[CERTIFICATE_DETAILS] WHERE [Certificate_no] IN ('121108883','121108890')
您需要创建 -
DECLARE @COESNo as VARCHAR(100)
set @COESNo = '''121108883''' + ',' + '''121108890'''
由于证书编号为varchar,因此字符串构建在形成的查询中需要单引号,该引号将显示三个单引号。
我已经在SQL FIDDLE上为您创建了工作演示 - CLICK HERE