我有一个值列表,例如
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.pk
是int
注意:做
declare @t as table (
num int
)
insert into @t values (#Placeholder#)
不起作用。
答案 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;
您可以轻松地在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
准确回答你的问题:
以下是CTE
insert into @t(num)
SELECT ID FROM MyIDs
...你实际上会填充你声明的表变量 - 如果你以后需要它......