将文本拆分为4个字符,没有分隔符

时间:2016-09-21 05:25:39

标签: 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)

3 个答案:

答案 0 :(得分:1)

将此查询用于所需的输出:

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)

答案 1 :(得分:0)

按照以下步骤操作。

  1. 创建一个按字符长度分割数据的函数。

    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
    
  2. 通过将您的列和字符长度作为输入传递来调用该函数,如下所示。

    SELECT ID ,SplitString
    FROM YourTable
      CROSS APPLY 
      dbo.SplitStringByLength (YourColumn,4)-- mention the character length to split
    
  3. 输出 enter image description here

答案 2 :(得分:0)

递归CTE可以帮助您:

<div class="div_back">
			<div class="div_front">
			<form>
					<label for="username"></label>
					<input type="text" id="username" name="username" style="text-align:center" placeholder="username">
					<label for="password"></label>
					<input type="text" id="password" name="password"  style="text-align:center" placeholder="password">     
					<input type="submit" value="Sign In">	
					<div style="display:flex; padding:0px;">
					<input type="submit_reset" value="Forgot password?" style="margin-right:5px;">
					<input type="submit_signup" value="Sign Up">
					</div>
				</form>
			</div>		
</div>

输出:

;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