Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将文本拆分为4个字符,不带分隔符_Sql_Sql Server_Ssis_Split_Substring - Fatal编程技术网

Sql 将文本拆分为4个字符,不带分隔符

Sql 将文本拆分为4个字符,不带分隔符,sql,sql-server,ssis,split,substring,Sql,Sql Server,Ssis,Split,Substring,你知道如何将一长串文本分割成多个记录,每个记录的固定宽度为4个字符,并且没有分隔符吗 例如: 资料来源: 1 11223344 2 ABCD 3 XYZ12345 预期结果: 1 1122 1 3344 2 ABCD 3 XYZ1 3 2345 长文本字符串当前位于表的一列中。我的最终结果是将它的前4个字符放入一个记录,下4个字符放入另一个记录,依此类推。我还需要有一个标识符,告诉我第一个X数量的记录属于源文件等的第一个记录(在上面的示例中,它是第一列-1、2、3)遵循以下步骤

你知道如何将一长串文本分割成多个记录,每个记录的固定宽度为4个字符,并且没有分隔符吗

例如:

资料来源:

1   11223344
2   ABCD
3   XYZ12345
预期结果:

1 1122
1 3344
2 ABCD
3 XYZ1
3 2345

长文本字符串当前位于表的一列中。我的最终结果是将它的前4个字符放入一个记录,下4个字符放入另一个记录,依此类推。我还需要有一个标识符,告诉我第一个X数量的记录属于源文件等的第一个记录(在上面的示例中,它是第一列-1、2、3)

遵循以下步骤

  • 创建一个按字符长度分割数据的函数

    CREATE FUNCTION SplitStringByLength
    (   
     @inputString varchar(max),
     @length int
    )
    RETURNS @SplitStrings TABLE( SplitString VARCHAR(50) ) 
    AS
    BEGIN
      DECLARE @s VARCHAR(50)
      WHILE len(@inputString) > 0
       BEGIN
          SET @s = left(@inputString, @length)
          SET @inputString = right(@inputString, len(@inputString) - @length)
          INSERT @SplitStrings VALUES (@s)
       END
    RETURN 
    END
    
  • 通过将列和字符长度作为输入传递给函数,如下所示

    SELECT ID ,SplitString
    FROM YourTable
      CROSS APPLY 
      dbo.SplitStringByLength (YourColumn,4)-- mention the character length to split
    
  • 输出:

    使用此查询获得所需的输出:

    Select substring('11223344',0,5)
    Select substring('11223344',5,9)
    Select substring('ABCD',0,5)
    ------Select substring('ABCD',5,9)
    Select substring('XYZ12345',0,5)
    Select substring('XYZ12345',5,9)
    

    递归CTE可以帮助您:

    ;WITH cte AS (
    SELECT  ID,
            CAST(SUBSTRING(string,1,4) as nvarchar(4))as S,
            LEN(String) as L,
            1 as [Level]
    FROM YourTable
    UNION ALL
    SELECT  y.ID,
            CAST(SUBSTRING(string,(4*[Level])+1,(4*[Level])+4) as nvarchar(4)),
            L-4,
            [Level]+1
    FROM YourTable y
    INNER JOIN cte c
        ON y.ID = c.ID 
    WHERE L > 4
    )
    
    SELECT  ID,
            S
    FROM cte
    ORDER BY ID
    
    输出:

    ID  S
    1   1122
    1   3344
    2   ABCD
    3   XYZ1
    3   2345
    

    是在表的一个字段中放入多个记录的一个长字符串吗?或多个字段、表格?长文本字符串当前位于表格的一列中。我的最终结果是将它的前4个字符放入一个记录,下4个字符放入另一个记录,依此类推。我还需要一个标识符来告诉第一个X数量的记录属于源文件等的第一个记录(在上面的示例中,它是第一列-1,2,3)。您的
    源代码中没有分隔符?
    我认为如果您的源代码是那样的
    11223344
    分隔符是
    选项卡
    然后您看到的第一个1只是另一列,id字段。不幸的是,需要拆分的文本字段没有分隔符。分割的规则是按宽度,每个4个字符。