我想做这样的事情:
DECLARE @list nvarhcar(200) SET @list = 'VALUE1,VALUE2,VALUE3'
Select * from foo where field in (@list)
直到今天我解决了使用sp_executeSQL程序,我自己的数据库函数csv2table和subselect,但我认为这不是很干净。
有没有办法解决而不使用动态sql?有直接的方法吗?
我正在使用Microsoft Sql Server 2005。
谢谢!
答案 0 :(得分:1)
请您尝试如下:谢谢
DECLARE @list nvarchar(200)
SET @list = 'VALUE1,VALUE2,VALUE3'
SELECT * FROM foo WHERE CHARINDEX(',' + field + ',', ',' + @list + ',') > 0
答案 1 :(得分:0)
如果字段的数据类型是nchar或varchar,则IN()运算符将查找类似
的值IN('VALUE1','VALUE2','VALUE3', etc..)
因此,您可以根据
设置@list
答案 2 :(得分:0)
将A部分创建为UDF
/* Part A */
DECLARE @list Varchar(max) = 'VALUE1,VALUE2,VALUE3'
DECLARE @tmpTbl_Values Table (ID varchar(50))
Set @list = @list + ','
-- Indexes to keep the position of searching
Declare @Pos1 Int
Declare @pos2 Int
-- Start from first character
Set @Pos1=1
Set @Pos2=1
While @Pos1<Len(@list)
Begin
Set @Pos1 = CharIndex(',',@list,@Pos1)
Insert @tmpTbl_Values Select Cast(Substring(@list,@Pos2,@Pos1-@Pos2) As varchar(50))
-- Go to next non comma character
Set @Pos2=@Pos1+1
-- Search from the next charcater
Set @Pos1 = @Pos1+1
End
/* Part B */
SELECT *
FROM foo A
INNER JOIN @tmpTbl_Values B
ON AB.ID = B.ID
答案 3 :(得分:0)
另一种选择:
Select * from foo where '%,' + field + ',%' like ',' + (@list) + ','
这甚至比现有方法“更脏”。
理想情况下,我建议将查询字符串更改为:
Select * from foo where field in ()
然后读取@list中的值列表,为每个值插入?
(用逗号分隔)并将每个值绑定到该参数标记。但是,我不知道如何在动态SQL中实现这一点。
答案 4 :(得分:0)
可能的方法是执行以下操作:
SELECT * FROM foo WHERE CHARINDEX(',' + field + ',', ',' + @list + ',') > 0
这假设字段中的数据中没有逗号
答案 5 :(得分:0)
如果你处理一个字符串字段,你可以使用这样的东西..
DECLARE @csv varchar(50) = 'item1,item2, item3, item4 ,item5'
SELECT * FROM foo WHERE PATINDEX('%' + Field + '%', @csv) > 0
答案 6 :(得分:-1)
在SQL 2005中,您可以使用自定义UDF将分隔列表解析为表格 - 请参阅此文章http://www.sommarskog.se/arrays-in-sql-2005.html