【问题标题】:Comma-separated String into Table's Column in SQL Server逗号分隔的字符串到 SQL Server 中表的列中
【发布时间】:2014-04-05 11:52:22
【问题描述】:

我正在使用 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'

我希望将这些值放入行中。

喜欢

0.00
0.00
1576
...

【问题讨论】:

标签: sql sql-server-2008 csv


【解决方案1】:

创建一个函数:

CREATE FUNCTION [dbo].[Split](@String nvarchar(4000), @Delimiter char(1))
RETURNS @Results TABLE (Items nvarchar(4000))
AS
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)
            ELSE
                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
        END
    RETURN
END

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

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

它将结果作为表格返回:

Items

0.00
0.00
1576.95
0.00
4105.88
1017.87
0.00
6700.70

SQL Fiddle

【讨论】:

  • 请不要使用 WHILE 循环分割函数。这是非常低效的。有几个更好的选择。无论如何,这个问题是重复的,我会立即发布链接。
【解决方案2】:

试试这个功能

CREATE FUNCTION UF_CSVToTable_new(@psCSString VARCHAR(8000))
RETURNS @otTemp TABLE(sID VARCHAR(20))
AS
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)
  END
RETURN
END

用法

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)

结果

【讨论】:

  • 请不要使用 WHILE 循环分割函数。这是非常低效的。此功能仅适用于非常小的列表,但根本无法很好地扩展。许多人围绕 T-SQL 中的拆分进行了大量测试,我的回答中提到了三种已知可以正常工作的方法。
【解决方案3】:

这个问题与其他几个问题重复,但一些被接受的答案仍然是低效的 WHILE 循环或递归 CTE。有三种方法可以完成不会影响性能的拆分:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 2015-03-29
    相关资源
    最近更新 更多