2014-03-04 97 views
2

我与SQL Server的工作,我已经成功地转换表的行成逗号分隔值,现在我要以逗号分隔值的该字符串转换回表的行。逗号分隔的字符串到表的列在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 
... 
+0

可能重复[如何分割/逗号分隔的字符串场爆炸成SQL查询](http://stackoverflow.com/questions/19334380/how-to-split-explode-comma-delimited-string-现场为-SQL查询) –

+0

重复http://stackoverflow.com/questions/2647/split-string-in-sql,但对于一个选择的答案仍然使用低效的一段时间。 –

回答

0

创建一个函数:

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

+1

请不要使用WHILE循环分割功能。这是非常低效的。有几个更好的选择。无论如何,这个问题是重复的,我会在此时发布链接。 –

0

试试这个功能

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) 

结果

enter image description here

+0

请不要使用WHILE循环分割功能。这是非常低效的。这个功能只适用于非常小的列表,但不能很好地扩展。很多人在T-SQL中进行了很多测试,并且我的答案中提到了三种已知正常工作的方法。 –

1

这个问题是少数人的副本,但一些接受的答案仍然是低效的WHILE循环或递归的CTE。有三种方式来完成拆分,不会杀死性能:

相关问题