将字符串中动态创建的逗号分隔值传递给' in' SQL中的子句

时间:2015-10-01 17:37:44

标签: sql sql-server

我试图将变量中的逗号分隔值传递给select语句,但我没有得到结果。

这是 SQL

DECLARE @dataCodes XML = '<Root>
                    <List Value="120" />
                    <List Value="110" />
                </Root>';      

DECLARE @ConcatString VARCHAR(MAX);

SELECT @ConcatString = COALESCE(@ConcatString + ',','') + Code
FROM (
    SELECT T.Item.value('@Value[1]', 'VARCHAR(MAX)') AS Code
    FROM @dataCodes.nodes('/Root/List') AS T(Item)
    ) as TBL

SET @ConcatString=''''+REPLACE(@ConcatString,',',''',''') +'''';

SELECT NAME, ID, ROLE from MyTable where CODE in (@ConcatString); -- not working

输出@ConcatString

enter image description here

注意:

如果我直接传递值,如下所示,我可以看到结果,

SELECT NAME, ID, ROLE from MyTable where CODE in ('110','120');

我正在尝试这个,因为我的SQL结构类似于:

 WITH JMATRIX_RESULT AS(      
       SELECT DISTINCT  ... from MyTable1 where CODE in (@ConcatString)
UNION
       SELECT DISTINCT  ... from MyTable2 where CODE in (@ConcatString)
UNION 
       SELECT DISTINCT  ... from MyTable3 where CODE in (@ConcatString)
),
...

我将参数作为逗号分隔值传递时看到了性能提升。

期望:

如果我将字符串(@ConcatString)中动态创建的逗号分隔值传递给select语句的in子句,它应该返回值。

任何建议都表示赞赏。

1 个答案:

答案 0 :(得分:3)

为什么要连接字符串,只需执行以下操作:

DECLARE @dataCodes XML = '<Root>
                            <List Value="120" />
                            <List Value="110" />
                          </Root>'; 


SELECT NAME, ID, ROLE 
from MyTable 
where CODE in (
                SELECT T.Item.value('@Value[1]', 'VARCHAR(MAX)') AS Code
                FROM @dataCodes.nodes('/Root/List') AS T(Item)
               );