【发布时间】:2011-12-15 11:39:37
【问题描述】:
我想做这样的事情:
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。
谢谢!
【问题讨论】:
-
一旦您意识到
field的内容实际上可能包含逗号,您就应该明白为什么SQL 不会神奇地将您的单个字符串撕开并将其视为3 个单独的值。 -
为什么不能使用动态SQL?
-
动态 SQL 有 2 个主要缺陷,尤其是在存储过程中使用时——考虑到参数的存在——这里可能就是这种情况。 1) 用户需要对 foo 表具有 SELECT 权限(这可以通过 EXECUTE AS 解决,我知道) 2) @list 参数可能包含类似:
NULL); <some evil code here>;declare @x int;SELECT @x=(1的内容。假设 dyn-sql 部分是幼稚的EXEC ('SELECT * FROM foo WHERE field in (' + @list + ')'),这将导致比您讨价还价的麻烦更多..
标签: sql sql-server select csv