如何将CSV转换为单行的列?

时间:2011-01-06 06:22:44

标签: sql tsql

我有一个逗号分隔的变量,如

a,b,c,d,e

我希望所有这些变量都成为单行的列

喜欢

a|b|c|d|e --------

更多例子

MISC FEES,UNIV EXE,ID FEE,TENT FEE,CAU FEES,GYM FEE 

这是我拥有的逗号分隔变量,使用SQL我需要将其转换为列

MISCFEES UNIVEXE IDFEE TENTFEE CAUFEES GYMFEE 

作为单行的列值,其中misc费用是第一列,univfee是下一列等等

2 个答案:

答案 0 :(得分:0)

SQL Server没有内置功能,可以将逗号分隔值添加到单行中的单独列中。您必须使用函数或存储过程构建它。

您可以使用CHARINDEX查找每个分隔符的位置,然后使用SUBSTRING获取逗号之间的每个值并相应地更新列。

答案 1 :(得分:0)

以下函数将分隔以逗号分隔的列表的每个值 进入列并返回一个表。

CREATE FUNCTION [dbo].[fn_CommaDelimitedToTable]
    (
      @String AS varchar(MAX)
    )
RETURNS @RetTable Table ( DataValue varchar(500) )
AS BEGIN
    DECLARE @ReturnedTable Table ( DataValue varchar(500) )
    DECLARE @BreakLoop Int
    DECLARE @CharIndex Int
    DECLARE @StringTmp Varchar(MAX)
    DECLARE @WrdTmp Varchar(500)
    DECLARE @Count Int
    SET @StringTmp = @String
    SET @Count = 0
    SET @BreakLoop = 0
    WHILE @BreakLoop = 0
        BEGIN
            SET @CharIndex = CHARINDEX(',', @StringTmp, 1)
            IF @CharIndex = 0 OR @CharIndex IS NULL
                BEGIN
                    SET @WrdTmp = Ltrim(Rtrim(@StringTmp))
                    SET @BreakLoop = 1
                END
            ELSE 
                BEGIN

                    SET @WrdTmp = ltrim(rtrim(Left(@StringTmp, @CharIndex - 1)))

                    SET @StringTmp = Ltrim(rtrim(Right(@StringTmp,
                                                       Len(@StringTmp)
                                                       - Len(@WrdTmp) - 1)))
                END

            INSERT  INTO @ReturnedTable ( DataValue )
            VALUES  ( @WrdTmp )
            SET @WrdTmp = ''
            SET @Count = @Count + 1
            IF @BreakLoop = 1 
                BEGIN 
                    BREAK
                END
            ELSE 
                BEGIN
                    CONTINUE
                END
        END
    INSERT  INTO @RetTable
            SELECT  DataValue
            FROM    @ReturnedTable
    RETURN
   END