T-SQL:如何做到这一点:从xy中选择*其中uid in(@parameter)

时间:2011-07-19 07:15:29

标签: sql sql-server sql-server-2005 tsql reporting-services

问题:

如何做到这一点:

DECLARE @StateUID varchar(max)  

SET @StateUID = 'E8812237-2F3B-445E-8EEF-020E0B6F6A53, 66E57225-642F-45B5-8E5D-070F2D1CF99D, 751C615B-EB9C-4D25-955D-0E0EB3CD05A2' 


SELECT StateFullName, StateAbbrv, StateID
FROM tblStates 
WHERE StateUID IN ( @StateID )

如下所示执行string.join也无济于事:

SET @StateUID = '''E8812237-2F3B-445E-8EEF-020E0B6F6A53'', ''66E57225-642F-45B5-8E5D-070F2D1CF99D'', ''751C615B-EB9C-4D25-955D-0E0EB3CD05A2''' 




我现在已将它移动到动态SQL中,它可以工作。

但这非常容易出错,烦人且费时,所以我想问一下是否有任何非疯狂的方法(没有临时表,功能等)?

4 个答案:

答案 0 :(得分:4)

看一下这个链接 -

http://www.sommarskog.se/arrays-in-sql.html

还有一个问题,我记得在堆栈溢出播客中讨论过它,它经历了许多不同的技术(并非所有与存储过程相关) -

Parameterize an SQL IN clause

答案 1 :(得分:3)

在这种情况下,您似乎可以使用'like'

DECLARE @QueryUIDs  varchar(MAX)
SET @QueryUIDs = '''E8812237-2F3B-445E-8EEF-020E0B6F6A53'', ''66E57225-642F-45B5-8E5D-070F2D1CF99D'', ''751C615B-EB9C-4D25-955D-0E0EB3CD05A2''' 

SELECT StateFullName, StateAbbrv, StateUID
FROM tblStates 
WHERE @QueryUIDs LIKE '%' + CAST(StateUID AS CHAR(36)) + '%'

答案 2 :(得分:1)

一种选择是将逗号分隔的字符串解析为子查询。下面的代码假定您可以从@StateUID字符串中删除空格,并且StateID是唯一标识符:

DECLARE @StateUID varchar(max), @xml xml  

SET @StateUID = 'E8812237-2F3B-445E-8EEF-020E0B6F6A53,' + 
    '66E57225-642F-45B5-8E5D-070F2D1CF99D,' + 
    '751C615B-EB9C-4D25-955D-0E0EB3CD05A2' 

SET @xml = '<root><r>' + replace(@StateUID,',','</r><r>') + '</r></root>'

SELECT StateFullName, StateAbbrv, StateID
FROM tblStates 
WHERE StateID IN ( 
    SELECT
      CONVERT(uniqueidentifier, t.value('.','varchar(36)')) as [id]
    FROM @xml.nodes('//root/r') as a(t)
) 

有很多很棒string splitting functions,但使用XML是我最喜欢的。

答案 3 :(得分:0)

如果你不喜欢临时表和数组,你可以使用多个变量:

DECLARE @StateUID_1 varchar(max)  
DECLARE @StateUID_2 varchar(max)  
DECLARE @StateUID_3 varchar(max)  

SET @StateUID_1 = 'E8812237-2F3B-445E-8EEF-020E0B6F6A53'
SET @StateUID_2 = '66E57225-642F-45B5-8E5D-070F2D1CF99D'
SET @StateUID_3 = '751C615B-EB9C-4D25-955D-0E0EB3CD05A2' 


SELECT StateFullName, StateAbbrv, StateID
FROM tblStates 
WHERE StateUID IN ( @StateUID_1, @StateUID_2, @StateUID_3 )