Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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 2008 r2 sql语句中以逗号分隔的值与变量_Sql Server 2008 R2 - Fatal编程技术网

Sql server 2008 r2 sql语句中以逗号分隔的值与变量

Sql server 2008 r2 sql语句中以逗号分隔的值与变量,sql-server-2008-r2,Sql Server 2008 R2,我在变量中得到了逗号分隔的值(比如变量名@listobj) 但当我使用下面的语句时,它并没有给出正确的结果 SELECT * FROM someTable Where column1 IN (@listobj) 但是abc在表中是存在的 我哪里做错了?这是一个经典问题,答案是否定的,不能以这种方式使用参数。不过,有几个变通办法 其中之一是解析存储过程中的值,并在过程中动态生成sql以供以后执行。然而,这不是一个好的做法 参考这个问题 这里也有一些很好的讨论 创建一个函数,将字符串拆分为

我在变量中得到了逗号分隔的值(比如变量名@listobj)

但当我使用下面的语句时,它并没有给出正确的结果

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))+',%'