Sql server 2008 r2 sql语句中以逗号分隔的值与变量
我在变量中得到了逗号分隔的值(比如变量名@listobj) 但当我使用下面的语句时,它并没有给出正确的结果Sql server 2008 r2 sql语句中以逗号分隔的值与变量,sql-server-2008-r2,Sql Server 2008 R2,我在变量中得到了逗号分隔的值(比如变量名@listobj) 但当我使用下面的语句时,它并没有给出正确的结果 SELECT * FROM someTable Where column1 IN (@listobj) 但是abc在表中是存在的 我哪里做错了?这是一个经典问题,答案是否定的,不能以这种方式使用参数。不过,有几个变通办法 其中之一是解析存储过程中的值,并在过程中动态生成sql以供以后执行。然而,这不是一个好的做法 参考这个问题 这里也有一些很好的讨论 创建一个函数,将字符串拆分为
SELECT * FROM someTable
Where column1 IN (@listobj)
但是abc在表中是存在的
我哪里做错了?这是一个经典问题,答案是否定的,不能以这种方式使用参数。不过,有几个变通办法 其中之一是解析存储过程中的值,并在过程中动态生成sql以供以后执行。然而,这不是一个好的做法 参考这个问题 这里也有一些很好的讨论
创建一个函数,将字符串拆分为
CREATE FUNCTION dbo.Split(@String varchar(8000), @Delimiter char(1))
returns @temptable TABLE (items varchar(8000))
as
begin
declare @idx int
declare @slice varchar(8000)
select @idx = 1
if len(@String)<1 or @String is null return
while @idx!= 0
begin
set @idx = charindex(@Delimiter,@String)
if @idx!=0
set @slice = left(@String,@idx - 1)
else
set @slice = @String
if(len(@slice)>0)
insert into @temptable(Items) values(@slice)
set @String = right(@String,len(@String) - @idx)
if len(@String) = 0 break
end
return
end
then make call to the function SELECT * FROM someTable
Where column1 IN (dbo.Split(@listobj))
创建函数dbo.Split(@String varchar(8000),@Delimiter char(1))
返回@tentable表(items varchar(8000))
作为
开始
声明@idx int
声明@slice varchar(8000)
选择@idx=1
如果len(@String)0)
插入到@attreable(Items)值(@slice)
设置@String=right(@String,len(@String)-@idx)
如果len(@String)=0中断
结束
返回
结束
然后调用函数SELECT*fromsometable
其中第1列位于(dbo.Split(@listobj))
此链接详细讨论了该问题:此链接的可能副本不起作用。当我执行硬编码值时,它工作正常,但不使用变量:(@Zerotoinfinite:我认为是这样,因为
column1
或@listobj
最后有空格。例如,它们不是VARCHAR(),而是CHAR()。我更改了SQL以处理此问题。
CREATE FUNCTION dbo.Split(@String varchar(8000), @Delimiter char(1))
returns @temptable TABLE (items varchar(8000))
as
begin
declare @idx int
declare @slice varchar(8000)
select @idx = 1
if len(@String)<1 or @String is null return
while @idx!= 0
begin
set @idx = charindex(@Delimiter,@String)
if @idx!=0
set @slice = left(@String,@idx - 1)
else
set @slice = @String
if(len(@slice)>0)
insert into @temptable(Items) values(@slice)
set @String = right(@String,len(@String) - @idx)
if len(@String) = 0 break
end
return
end
then make call to the function SELECT * FROM someTable
Where column1 IN (dbo.Split(@listobj))
select * from someTable
where ','+LTRIM(RTRIM(@listobj))+',' LIKE '%,'+LTRIM(RTRIM(column1))+',%'