添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

在SQL Server中把逗号分隔的字符串放入表的列中

3 人关注

我正在使用SQL Server,我已经成功地将一个表的行转换成了逗号分隔的值,现在我想将逗号分隔的值的字符串转换回表的行。

我有这样一个字符串 ( Varchar )

DECLARE @str AS varchar(Max)
SET @str = '0.00,0.00,1576.95,0.00,4105.88,1017.87,0.00,6700.70'

我想把这些值转换成行。

2 个评论
sql
sql-server-2008
csv
DareDevil
DareDevil
发布于 2014-03-04
3 个回答
Raging Bull
Raging Bull
发布于 2014-03-04
已采纳
0 人赞同

创建一个函数。

CREATE FUNCTION [dbo].[Split](@String nvarchar(4000), @Delimiter char(1))
RETURNS @Results TABLE (Items nvarchar(4000))
BEGIN
    DECLARE @Index INT
    DECLARE @Slice nvarchar(4000)
    -- HAVE TO SET TO 1 SO IT DOESN’T EQUAL ZERO FIRST TIME IN LOOP
    SELECT @Index = 1
    WHILE @Index !=0
        BEGIN
            SELECT @Index = CHARINDEX(@Delimiter,@String) --Getting the indexof the first Occurrence of the delimiter
            -- Saving everything to the left of the delimiter to the variable SLICE
            IF @Index !=0
                SELECT @Slice = LEFT(@String,@Index - 1)
                SELECT @Slice = @String
            -- Inserting the value of Slice into the Results SET
            INSERT INTO @Results(Items) VALUES(@Slice)
            --Remove the Slice value from Main String
            SELECT @String = RIGHT(@String,LEN(@String) - @Index)
            -- Break if Main String is empty
            IF LEN(@String) = 0 BREAK
    RETURN

将字符串@str 和分隔符(,)传给该函数。

SELECT Items FROM [dbo].[Split] (@str, ',')

它将以表的形式返回结果。

Items
1576.95
4105.88
1017.87
6700.70

查看 SQL Fiddle

请不要使用WHILE循环分割函数。它是非常低效的。有几个更好的选择。反正这个问题是重复的,我马上就会把链接贴出来。
Solomon Rutzky
Solomon Rutzky
发布于 2014-03-04
0 人赞同

这个问题与其他几个问题是重复的,但一些公认的答案仍然是低效的WHILE循环或递归CTE。有三种方法可以完成不会扼杀性能的分割。

  • 数字/统计表。 http://www.sqlservercentral.com/articles/Tally+Table/72993/ (免费 需要注册)

  • https://www.simple-talk.com/blogs/2012/01/05/using-xml-to-pass-lists-as-parameters-in-sql-server/

  • SQLCLR:在许多网站上都有许多这样的例子,但你最好的(也是最简单的)选择是抓紧时间,在网站上提供一个关于SQLCLR的例子。 但你最好的(也是最简单的)选择是抓取上面提到的数字/统计表文章中提供的例子。 数字/统计表的文章中所提供的,或者直接安装 SQL# (SQLsharp) (我是SQL#的作者,但String_Split和String_Split4k在 免费版本)。

  • Vignesh Kumar A
    Vignesh Kumar A
    发布于 2014-03-04
    0 人赞同

    试试这个功能

    CREATE FUNCTION UF_CSVToTable_new(@psCSString VARCHAR(8000))
    RETURNS @otTemp TABLE(sID VARCHAR(20))
    BEGIN
     DECLARE @sTemp VARCHAR(10)
      WHILE LEN(@psCSString) > 0
      BEGIN
      SET @sTemp = LEFT(@psCSString, ISNULL(NULLIF(CHARINDEX(',', @psCSString) - 1, -1),
                        LEN(@psCSString)))
      SET @psCSString = SUBSTRING(@psCSString,ISNULL(NULLIF(CHARINDEX(',', @psCSString), 0),
                                   LEN(@psCSString)) + 1, LEN(@psCSString))
      INSERT INTO @otTemp VALUES (@sTemp)
    RETURN
    
    DECLARE @str AS varchar(Max)
    SET @str = '0.00,0.00,1576.95,0.00,4105.88,1017.87,0.00,6700.70'
    SELECT * FROM UF_CSVToTable_new(@str)