问题:
如何做到这一点:
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中,它可以工作。
但这非常容易出错,烦人且费时,所以我想问一下是否有任何非疯狂的方法(没有临时表,功能等)?
答案 0 :(得分:4)
看一下这个链接 -
http://www.sommarskog.se/arrays-in-sql.html
还有一个问题,我记得在堆栈溢出播客中讨论过它,它经历了许多不同的技术(并非所有与存储过程相关) -
答案 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 )