【问题标题】:Split comma separated values to rows将逗号分隔的值拆分为行
【发布时间】:2018-01-22 16:57:24
【问题描述】:

如何从 SQL Server 中的逗号分隔字符串中获取值到行中,以便将它们插入到表中?

例如,使用以下数据:

 Declare @string as nvarchar(max);
 Declare @substring as nvarchar(50);
 set @string = "Apple, Banana, Cherry, Orange, Mango"

我目前硬编码了set @last = 2,对于这个例子,但@last 应该包含字符串中的单词数。参数@substring 将在循环中一一包含每个水果,我想用它来插入目标表。

这是我当前的代码,但我不知道如何将 @last 设置为所需的值:

DECLARE @first AS INT
SET @first = 1
DECLARE @step AS INT
SET @step = 1
DECLARE @last AS INT
SET @last = 2

BEGIN TRANSACTION
WHILE(@first <= @last)
BEGIN

INSERT INTO tbFruit(Name)   
VALUES(@substring);

SET @first += @step
END
COMMIT TRANSACTION

【问题讨论】:

  • @user2179026:不,这不是代码编写服务。请参阅How to Ask
  • @AmalMurali 这个问题还不错。它显示了重新创建它所需的所有代码的明显问题。
  • @Tanner:OP 删除了问题下的一条评论,内容类似于:“@artm 你能帮我写代码吗?”。

标签: sql-server regex tsql


【解决方案1】:

您可以一次性完成所有操作,而不是使用WHILE 循环。所以在这段代码中,它会将值推送到临时表的行中,然后再将其用于INSERT 到目标表中:

将逗号分隔值拆分为行的示例代码:

Convert Comma Separated column value to rows

DECLARE @string AS NVARCHAR(MAX);
DECLARE @substring AS NVARCHAR(50);
SET @string = 'Apple, Banana, Cherry, Orange, Mango'

SELECT Split.a.value('.', 'VARCHAR(100)') AS Fruits
INTO   #fruits
FROM   
   (
     SELECT CAST ('<M>' + REPLACE(@string, ', ', '</M><M>') + '</M>' AS XML) AS String
   ) AS A
     CROSS APPLY String.nodes('/M') AS Split ( a ); 

-- show what's in the temp table
SELECT *
FROM   #fruits

此时,您在临时表中的行中有值,您可以使用它来填充目标表,如下所示:

INSERT INTO tbFruit ( Name )
SELECT Fruits FROM #fruits

-- show what's in the target table
SELECT * FROM   #target_table

-- tidy up
DROP TABLE #fruits

SQL Fiddle Demo

TSQL 代码:

 DECLARE @string AS NVARCHAR(MAX) = 'Apple, Banana, Cherry, Orange, Mango'
 DECLARE @substring AS NVARCHAR(50)

 SELECT Split.a.value('.', 'VARCHAR(100)') AS Fruits
 INTO   #fruits
 FROM   ( SELECT    CAST ('<M>' + REPLACE(@string, ', ', '</M><M>') + '</M>' AS XML) AS String
        ) AS A
        CROSS APPLY String.nodes('/M') AS Split ( a )   

 CREATE TABLE #target_table ( Fruits NVARCHAR(50) )

 INSERT INTO #target_table
        ( fruits )
        SELECT  *
        FROM    #fruits

 SELECT * FROM   #target_table

 DROP TABLE #fruits
 DROP TABLE #target_table

结果

| FRUITS |
|--------|
|  Apple |
| Banana |
| Cherry |
| Orange |
|  Mango |

【讨论】:

  • 别担心 :) 再次感谢! (很高兴我昨天没有搜索这个。好时机)
【解决方案2】:

试试下面的代码:

DECLARE @string VARCHAR(MAX),
@Split CHAR(1),
@X xml

--The String containg the fruit names separated by comma.
SELECT @string = 'Apple, Banana, Cherry, Orange, Mango',

--Separator in the String.
@Split = ','

--Use XML to extract the fruit names.
SELECT @X = CONVERT(xml,'<root><s>' + REPLACE(@string,@Split,'</s><s>') + '</s></root>')

--Insert the fruit names into the table.
INSERT INTO tbFruit (Name) SELECT T.c.value('.','varchar(max)')
FROM @X.nodes('/root/s') T(c)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多