sql如何将此作为脚本编写

时间:2014-09-17 06:59:37

标签: sql sql-server tsql

我有以下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.

似乎无法正常工作

任何想法

3 个答案:

答案 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