-3

我有一列包含所有帐户组并按空格分隔。我想将所有这些组拆分到每个新列中,类似于 excel 上的“文本到列”工具,它可以将单个文本列拆分为多个列,并为每个新拆分列分配新的列名。我尝试了 charindex,但似乎有一些错误。

谢谢!

现有栏目:

Account Groups
ab bc cd cbd chjk 
abc
ab bc
bc

我希望它的新列:

Account1 Account2 Account3 Account4 Account5
--------------------------------------------
ab       bc       cd       cbd      chjk
abc
ab       bc
bc

我使用的代码:我创建了一个函数来首先分隔列。

CREATE FUNCTION dbo.newCOLUMNS
     (@TEXT VARCHAR(8000),
      @COLUMN TINYINT,
      @SEPARATOR CHAR(1))
RETURNS VARCHAR(8000)
AS
BEGIN
    DECLARE @POS_START INT = 1
    DECLARE @POS_END   INT = CHARINDEX(@SEPARATOR, @TEXT, @POS_START)

    WHILE (@COLUMN > 1 AND @POS_END > 0)
    BEGIN
        SET @POS_START = @POS_END + 1
        SET @POS_END = CHARINDEX(@SEPARATOR, @TEXT, @POS_START)
        SET @COLUMN = @COLUMN - 1
    END

    IF @COLUMN > 1  
        SET @POS_START = LEN(@TEXT) + 1

    IF @POS_END = 0 
        SET @POS_END = LEN(@TEXT) + 1

    RETURN SUBSTRING (@TEXT, @POS_START, @POS_END - @POS_START)
END

然后我把函数放到我的表中:

SELECT 
    dbo.newCOLUMNS([Name], 1, ' ') as Account1,
    dbo.newCOLUMNS([Name], 2, ' ') as Account2,
    dbo.newCOLUMNS([Name], 3, ' ') as Account3,
    dbo.newCOLUMNS([Name], 4, ' ') as Account4,
    dbo.newCOLUMNS([Name], 5, ' ') as Account5,
    dbo.newCOLUMNS([Name], 6, ' ') as Account6,
    dbo.newCOLUMNS([Name], 7, ' ') as Account7,
    dbo.newCOLUMNS([Name], 8, ' ') as Account8,
    dbo.newCOLUMNS([Name], 9, ' ') as Account9,
    dbo.newCOLUMNS([Name], 10, ' ') as Account10,
    dbo.newCOLUMNS([Name], 11, ' ') as Account11
FROM
    myTable;

该查询只能返回部分结果,这是错误消息:

消息 537,级别 16,状态 2,第 1 行
传递给 LEFT 或 SUBSTRING 函数的长度参数无效。

4

1 回答 1

0

显然,您已经吸取了不要存储分隔数据的教训。现在,如果您有已知的或最大数量的列,那么一点 XML 可能会有所帮助

例子

Select A.ID
      ,B.*
 From  YourTable A
 Cross Apply (
                Select Pos1  = xDim.value('/x[1]','varchar(max)')
                      ,Pos2  = xDim.value('/x[2]','varchar(max)')
                      ,Pos3  = xDim.value('/x[3]','varchar(max)')
                      ,Pos4  = xDim.value('/x[4]','varchar(max)')
                      ,Pos5  = xDim.value('/x[5]','varchar(max)')
                      ,Pos6  = xDim.value('/x[6]','varchar(max)')
                      ,Pos7  = xDim.value('/x[7]','varchar(max)')
                      ,Pos8  = xDim.value('/x[8]','varchar(max)')
                      ,Pos9  = xDim.value('/x[9]','varchar(max)')
                      ,Pos10 = xDim.value('/x[10]','varchar(max)')
                From  (Select Cast('<x>' + replace([Account Groups],' ','</x><x>')+'</x>' as xml) as xDim) as A 
             ) B

退货

在此处输入图像描述

于 2019-04-12T16:50:51.567 回答