如何在SQL Server中操作以逗号分隔的列表

时间:2016-05-19 18:34:17

标签: sql sql-server xml

我有一个值列表,例如

1,2,3,4...

将传递到我的SQL查询中。

我需要将这些值存储在表变量中。所以基本上我需要这样的东西:

declare @t (num int)
insert into @t values (1),(2),(3),(4)...

是否可以在SQL Server中进行格式化? (将1,2,3,4 ......转换为(1),(2),(3),(4)......

注意:在访问我的SQL脚本之前,我无法更改这些值的样子;我坚持这个清单。也可能并不总是4个值;它可以是1或更多。

编辑以显示哪些值看起来像:在正常情况下,这是它的工作方式:

select t.pk 
from a_table t
where t.pk in (#place_holder#)

#placeholder#只是一个文字占位符。当某人运行报告时,#placeholder#将替换为该报告过滤器中的文字值:

select t.pk 
from a_table t
where t.pk in (1,2,3,4) -- or whatever the user selects 

t.pkint

注意:做

declare @t as table (
num int
)

insert into @t values (#Placeholder#)

不起作用。

enter image description here

1 个答案:

答案 0 :(得分:0)

您的描述有点嘲讽,但您可以尝试一下:

无论你的意思是什么

  

我看到你想说的话;但是,如果我输入' #placeholder#'在剧本中,我最终会得到' 1'' 2'' 3'' 4'而不是' 1,2,3,4'

我假设这是一个带数字的字符串,每个数字在单个qoutes之间,用逗号分隔:

DECLARE @passedIn VARCHAR(100)='''1'',''2'',''3'',''4'',''5'',''6'',''7''';
SELECT @passedIn; -->: '1','2','3','4','5','6','7'

现在,变量@passedIn完全符合您所说的内容 我将使用动态SQL语句将其插入临时表(声明的表变量在这里不起作用......)

CREATE TABLE #tmpTable(ID INT);

DECLARE @cmd VARCHAR(MAX)=
'INSERT INTO #tmpTable(ID) VALUES (' + REPLACE(SUBSTRING(@passedIn,2,LEN(@passedIn)-2),''',''','),(') + ');';

EXEC (@cmd);

SELECT * FROM #tmpTable;
GO

DROP TABLE #tmpTable;

更新1:不需要动态SQL,所有ad-hoc ......

您可以轻松地在CTE中获取数字列表作为派生表。 这可以在以下语句中使用,例如WHERE SomeID IN(SELECT ID FROM MyIDs)(类似于this: dynamic IN section

    WITH MyIDs(ID) AS
    (
        SELECT A.B.value('.','int') AS ID
        FROM
        ( 
        SELECT CAST('<x>' + REPLACE(SUBSTRING(@passedIn,2,LEN(@passedIn)-2),''',''','</x><x>') + '</x>' AS XML) AS AsXml
        ) as tbl
        CROSS APPLY tbl.AsXml.nodes('/x') AS A(B)
    )
    SELECT * FROM MyIDs

更新2:

准确回答你的问题:

以下是CTE

insert into @t(num)
SELECT ID FROM MyIDs

...你实际上会填充你声明的表变量 - 如果你以后需要它......