过滤“IN”中的字段使用变量的子句
我想做这样的事情:
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。
谢谢!
I would like to do something like this :
DECLARE @list nvarhcar(200) SET @list = 'VALUE1,VALUE2,VALUE3'
Select * from foo where field in (@list)
Until today I solved using sp_executeSQL procedure, my own database function csv2table and subselect, but I think that is not very clean.
Is there any way to solve without use dynamic sql ? Is there a direct method?
I'm using Microsoft Sql Server 2005.
Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
请您尝试如下:谢谢
Would you please try as below: thanks
将 A 部分创建为 UDF
Create Part A as an UDF
一种替代方案:
这比现有方法甚至“更脏”。
理想情况下,我建议将查询字符串更改为:
然后读取 @list 中的值列表,为每个值插入
?
(用逗号分隔)并将每个值绑定到该参数标记。但是,我不知道如何单独用动态 SQL 来实现这一点。One alternative:
This is even "dirtier" than the existing approach.
Ideally, I would suggest changing the query string to:
then reading through the list of values in @list, inserting a
?
for each value (separated by commas) and binding each value to that parameter marker. However, I don't know how to achieve this in dynamic SQL alone.如果字段的数据类型是 nchar 或 varchar,则 IN() 运算符将查找类似的值,
因此您可以根据该值设置
@list
If the datatype for the field is nchar or varchar, the IN() operator will look for value like
So you set your
@list
based on that一种可能的方法是执行以下操作:
假设字段中的数据中没有逗号
A possible approach is to do the following:
This is assuming that the data in the field has no comma in it
如果你处理字符串字段,你可以使用这样的东西..
If you deal with a string field, you could use something like this..
在 SQL 2005 中,您可以使用自定义 UDF 将分隔列表解析为表 - 请参阅这篇文章 http://www.sommarskog.se/arrays-in-sql-2005.html
In SQL 2005 you can use a custom UDF to parse a delimited list into a table - please see this article http://www.sommarskog.se/arrays-in-sql-2005.html