用逗号分隔符拆分两个逗号分隔值并存储在同一临时 table 的两列中
Split two comma-separated values by comma delimeter and store in two columns of same temporary table
我再次需要您的帮助来编写 SQL 查询。
我有两个逗号分隔的字符串:
1,2,3 and a,b,c
两个逗号分隔值中的元素数量(例如 1、2 和 3)相同。在给定的示例中,它是 3。
我想要的是用逗号分隔符拆分逗号分隔值并将它们存储在同一临时的两列中table。
我正在使用 SQL Server 2012。
我找到了解决办法。但我想 post 它可以对其他人有所帮助,或者您可以指导我使其更有效 -
DECLARE @xml1 xml
DECLARE @xml2 xml
DECLARE @str1 VARCHAR(MAX)
DECLARE @str2 VARCHAR(MAX)
DECLARE @delimiter CHAR(1)
DECLARE @TmpTbl1 TABLE (Id INT IDENTITY(1,1), Col1 VARCHAR(50))
DECLARE @TmpTbl2 TABLE (Id INT IDENTITY(1,1), Col2 VARCHAR(50))
DECLARE @TmpTbl3 TABLE (Col1 VARCHAR(50), Col2 VARCHAR(50))
SET @str1 = '1,2,3'
SET @str2 = 'a,b,c'
SET @delimiter = ','
SET @xml1 = CAST(('<X>'+replace(@str1, @delimiter, '</X><X>')+'</X>') AS XML)
SET @xml2 = CAST(('<X>'+replace(@str2, @delimiter, '</X><X>')+'</X>') AS XML)
INSERT INTO @TmpTbl1 (Col1)
SELECT C.value('.', 'VARCHAR(50)') AS value FROM @xml1.nodes('X') AS X(C)
INSERT INTO @TmpTbl2 (Col2)
SELECT C.value('.', 'VARCHAR(50)') AS value FROM @xml2.nodes('X') AS X(C)
INSERT INTO @TmpTbl3 (Col1, Col2)
SELECT tmp1.Col1, tmp2.Col2
FROM @TmpTbl1 tmp1
INNER JOIN @TmpTbl2 tmp2 ON tmp1.Id = tmp2.Id
SELECT Col1, Col2 FROM @TmpTbl3
我建议您创建一个 UDF,它接受定界字符串输入和 returns 带有 ID 的 table,如下所示(因此可以在需要时重复使用):
Go
CREATE FUNCTION [dbo].[ReturnTableFromDelimetedStringWithID] (@list VARCHAR(MAX), @delimiter VARCHAR(30), @inclblanks BIT)
RETURNS @table TABLE (id INT NOT NULL PRIMARY KEY, item VARCHAR(3000) )
AS
BEGIN
DECLARE @item VARCHAR(3000)
DECLARE @delim VARCHAR(30)
DECLARE @str VARCHAR(MAX)
DECLARE @pos INT
DECLARE @id INT
SET @id = 0
SET @delim = @delimiter
IF @delim='' SET @delim=','
SET @str = @list + @delim
WHILE CHARINDEX (@delim, @str) > 0
BEGIN
SET @id = @id + 1
SET @pos = CHARINDEX (@delim, @str)
SET @item = CONVERT(VARCHAR(3000), SUBSTRING( @str, 1, @pos - 1))
SET @str = SUBSTRING( @str, @pos + LEN(@delim), LEN( @str))
IF @inclblanks=1
INSERT INTO @table VALUES (@id, @item)
ELSE
IF @item<>'' INSERT INTO @table VALUES (@id, @item)
END
RETURN
END
GO
然后,您可以像下面这样查询:
DECLARE @str1 VARCHAR(MAX) = '1,2,3'
DECLARE @str2 VARCHAR(MAX)= 'a,b,c'
DECLARE @delimiter CHAR(1) = ','
DECLARE @TmpTbl3 TABLE (Col1 VARCHAR(50), Col2 VARCHAR(50))
INSERT INTO @TmpTbl3
SELECT t1.c2, t2.c2
FROM
(
SELECT id [c1], item [c2] FROM dbo.ReturnTableFromDelimetedStringWithID(@str1, ',', 0)
) as t1
INNER JOIN
(
SELECT id [c1], item [c2] FROM dbo.ReturnTableFromDelimetedStringWithID(@str2, ',', 0)
) AS t2 ON t1.c1=t2.c1
--SELECT * FROM @TmpTbl3
这可能是最好的方法。
我再次需要您的帮助来编写 SQL 查询。
我有两个逗号分隔的字符串:
1,2,3 and a,b,c
两个逗号分隔值中的元素数量(例如 1、2 和 3)相同。在给定的示例中,它是 3。
我想要的是用逗号分隔符拆分逗号分隔值并将它们存储在同一临时的两列中table。
我正在使用 SQL Server 2012。
我找到了解决办法。但我想 post 它可以对其他人有所帮助,或者您可以指导我使其更有效 -
DECLARE @xml1 xml
DECLARE @xml2 xml
DECLARE @str1 VARCHAR(MAX)
DECLARE @str2 VARCHAR(MAX)
DECLARE @delimiter CHAR(1)
DECLARE @TmpTbl1 TABLE (Id INT IDENTITY(1,1), Col1 VARCHAR(50))
DECLARE @TmpTbl2 TABLE (Id INT IDENTITY(1,1), Col2 VARCHAR(50))
DECLARE @TmpTbl3 TABLE (Col1 VARCHAR(50), Col2 VARCHAR(50))
SET @str1 = '1,2,3'
SET @str2 = 'a,b,c'
SET @delimiter = ','
SET @xml1 = CAST(('<X>'+replace(@str1, @delimiter, '</X><X>')+'</X>') AS XML)
SET @xml2 = CAST(('<X>'+replace(@str2, @delimiter, '</X><X>')+'</X>') AS XML)
INSERT INTO @TmpTbl1 (Col1)
SELECT C.value('.', 'VARCHAR(50)') AS value FROM @xml1.nodes('X') AS X(C)
INSERT INTO @TmpTbl2 (Col2)
SELECT C.value('.', 'VARCHAR(50)') AS value FROM @xml2.nodes('X') AS X(C)
INSERT INTO @TmpTbl3 (Col1, Col2)
SELECT tmp1.Col1, tmp2.Col2
FROM @TmpTbl1 tmp1
INNER JOIN @TmpTbl2 tmp2 ON tmp1.Id = tmp2.Id
SELECT Col1, Col2 FROM @TmpTbl3
我建议您创建一个 UDF,它接受定界字符串输入和 returns 带有 ID 的 table,如下所示(因此可以在需要时重复使用):
Go
CREATE FUNCTION [dbo].[ReturnTableFromDelimetedStringWithID] (@list VARCHAR(MAX), @delimiter VARCHAR(30), @inclblanks BIT)
RETURNS @table TABLE (id INT NOT NULL PRIMARY KEY, item VARCHAR(3000) )
AS
BEGIN
DECLARE @item VARCHAR(3000)
DECLARE @delim VARCHAR(30)
DECLARE @str VARCHAR(MAX)
DECLARE @pos INT
DECLARE @id INT
SET @id = 0
SET @delim = @delimiter
IF @delim='' SET @delim=','
SET @str = @list + @delim
WHILE CHARINDEX (@delim, @str) > 0
BEGIN
SET @id = @id + 1
SET @pos = CHARINDEX (@delim, @str)
SET @item = CONVERT(VARCHAR(3000), SUBSTRING( @str, 1, @pos - 1))
SET @str = SUBSTRING( @str, @pos + LEN(@delim), LEN( @str))
IF @inclblanks=1
INSERT INTO @table VALUES (@id, @item)
ELSE
IF @item<>'' INSERT INTO @table VALUES (@id, @item)
END
RETURN
END
GO
然后,您可以像下面这样查询:
DECLARE @str1 VARCHAR(MAX) = '1,2,3'
DECLARE @str2 VARCHAR(MAX)= 'a,b,c'
DECLARE @delimiter CHAR(1) = ','
DECLARE @TmpTbl3 TABLE (Col1 VARCHAR(50), Col2 VARCHAR(50))
INSERT INTO @TmpTbl3
SELECT t1.c2, t2.c2
FROM
(
SELECT id [c1], item [c2] FROM dbo.ReturnTableFromDelimetedStringWithID(@str1, ',', 0)
) as t1
INNER JOIN
(
SELECT id [c1], item [c2] FROM dbo.ReturnTableFromDelimetedStringWithID(@str2, ',', 0)
) AS t2 ON t1.c1=t2.c1
--SELECT * FROM @TmpTbl3
这可能是最好的方法。