【问题标题】:How to manipulate comma-separated list in SQL Server如何在 SQL Server 中操作逗号分隔的列表
【发布时间】:2016-09-16 19:41:19
【问题描述】:

我有一个值列表,例如

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#)

不工作。

【问题讨论】:

  • 以下答案显示了一种使用表值函数执行此操作的方法:stackoverflow.com/a/5401777/13087
  • 这将向您展示如何使用表值参数stackoverflow.com/questions/30108973/…
  • 传递给我的 sql 脚本的内容看起来像 1,2,3,4 。它不是字符串,如果我可以将其转换为字符串,那么是的,这些答案会起作用。
  • 传递给脚本的“东西”是什么数据类型?换句话说,你如何在你的脚本中声明它?
  • 在这个答案中,我添加了一些不错的tricks you can do with XML and string values。转到“动态输入”部分。希望这会有所帮助。

标签: sql sql-server xml


【解决方案1】:

您的描述有点荒谬,但您可以尝试一下:

不管你是什么意思

我明白你想说什么;但如果我在脚本中输入 '#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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 2012-04-19
    • 2017-12-08
    相关资源
    最近更新 更多