在 Sql 中拆分字符串并存储在临时 table 中
Spliting string in Sql and storing in temp table
我 3 天前就遇到了一个问题,实际上,我正在处理 SSRS,其中存储过程需要多行参数,即将行拆分为“;”列为“,”。所以实际上我想用','和';'拆分列作为行,并将进一步插入临时 table。任何帮助将不胜感激。
EG:存储过程中的数据作为来自应用程序的参数:
101,1,1,1,5;
102,1,1,1,4;
103,1,1,1,3;
在存储过程中被接受为 Varchar
。
现在想将数据拆分为“;”一次然后对每一行使用“,”。
有很多方法可以使用 xml、cte 或循环来做到这一点。下面是 xml,
DECLARE @ParamStr VARCHAR(500) = '101,1,1,1,5; 102,1,1,1,4; 103,1,1,1,3;'
DECLARE @x XML
SELECT @x = CAST('<R><SemiCol><Comma>'+ REPLACE(REPLACE(@ParamStr,';','</Comma></SemiCol><SemiCol><Comma>'),',','</Comma><Comma>')+ '</Comma></SemiCol></R>' AS XML)
SELECT t.value('.', 'int') AS inVal
FROM @x.nodes('R/SemiCol/Comma') AS x(t)
WHERE LEN(t.value('.', 'varchar(10)')) > 0
如果我正确理解了问题,数据需要基于字符串的行和列,用','和';'分割列作为行
DECLARE @PARAM_STRING VARCHAR(100)='101,1,1,1,5; 102,1,1,1,4; 103,1,1,1,3;11,11,11,11,11;12,12,12,12,12;'
DECLARE @DYNAMIC_QUERY VARCHAR(MAX)
DECLARE @TABLE TABLE(ID INT,DATA VARCHAR(MAX))
INSERT INTO @TABLE
SELECT 1 ID, 'SELECT '+DATA FROM (
SELECT A.B.value('.','VARCHAR(50)')DATA FROM
(SELECT CAST('<A>'+REPLACE(@PARAM_STRING,';','</A><A>')+'</A>' AS XML)COL)T
CROSS APPLY T.COL.nodes('/A') AS A(B))F WHERE DATA<>''
SELECT @DYNAMIC_QUERY=STUFF((SELECT ' UNION ' + CAST(DATA AS VARCHAR(MAX)) [text()]FROM @TABLE WHERE ID = t.ID
FOR XML PATH(''), TYPE).value('.','NVARCHAR(MAX)'),1,7,' ')
FROM @TABLE t GROUP BY ID
EXECUTE(@DYNAMIC_QUERY)
结果:
(No column name) (No column name) (No column name) (No column name) (No column name)
11 11 11 11 11
12 12 12 12 12
101 1 1 1 5
102 1 1 1 4
103 1 1 1 3
我 3 天前就遇到了一个问题,实际上,我正在处理 SSRS,其中存储过程需要多行参数,即将行拆分为“;”列为“,”。所以实际上我想用','和';'拆分列作为行,并将进一步插入临时 table。任何帮助将不胜感激。
EG:存储过程中的数据作为来自应用程序的参数:
101,1,1,1,5;
102,1,1,1,4;
103,1,1,1,3;
在存储过程中被接受为 Varchar
。
现在想将数据拆分为“;”一次然后对每一行使用“,”。
有很多方法可以使用 xml、cte 或循环来做到这一点。下面是 xml,
DECLARE @ParamStr VARCHAR(500) = '101,1,1,1,5; 102,1,1,1,4; 103,1,1,1,3;'
DECLARE @x XML
SELECT @x = CAST('<R><SemiCol><Comma>'+ REPLACE(REPLACE(@ParamStr,';','</Comma></SemiCol><SemiCol><Comma>'),',','</Comma><Comma>')+ '</Comma></SemiCol></R>' AS XML)
SELECT t.value('.', 'int') AS inVal
FROM @x.nodes('R/SemiCol/Comma') AS x(t)
WHERE LEN(t.value('.', 'varchar(10)')) > 0
如果我正确理解了问题,数据需要基于字符串的行和列,用','和';'分割列作为行
DECLARE @PARAM_STRING VARCHAR(100)='101,1,1,1,5; 102,1,1,1,4; 103,1,1,1,3;11,11,11,11,11;12,12,12,12,12;'
DECLARE @DYNAMIC_QUERY VARCHAR(MAX)
DECLARE @TABLE TABLE(ID INT,DATA VARCHAR(MAX))
INSERT INTO @TABLE
SELECT 1 ID, 'SELECT '+DATA FROM (
SELECT A.B.value('.','VARCHAR(50)')DATA FROM
(SELECT CAST('<A>'+REPLACE(@PARAM_STRING,';','</A><A>')+'</A>' AS XML)COL)T
CROSS APPLY T.COL.nodes('/A') AS A(B))F WHERE DATA<>''
SELECT @DYNAMIC_QUERY=STUFF((SELECT ' UNION ' + CAST(DATA AS VARCHAR(MAX)) [text()]FROM @TABLE WHERE ID = t.ID
FOR XML PATH(''), TYPE).value('.','NVARCHAR(MAX)'),1,7,' ')
FROM @TABLE t GROUP BY ID
EXECUTE(@DYNAMIC_QUERY)
结果:
(No column name) (No column name) (No column name) (No column name) (No column name)
11 11 11 11 11
12 12 12 12 12
101 1 1 1 5
102 1 1 1 4
103 1 1 1 3