拆分固定长度的字符串

时间:2012-09-26 14:58:03

标签: sql sql-server sql-server-2008

我需要在sql server中拆分一个字符串并将数据插入表中。 Te字符串是固定长度,没有逗号分隔。在字符串中,我可以插入1个或多个记录,例如:

id = 2个字符 name = 4个字符

字符串:01AAAA02BBBB03CCCC

在这个例子中我有3个要插入的记录(我在字符串中只能有一个或多个记录)

id名称    01 AAAA    02 BBBB    03 CCCC

我需要一种方法将这些信息拆分为两个不同的列和三个不同的行。我想使用BCP实用程序,但我不确定,也许我需要拆分并生成一个文件然后使用BCP。

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

由于字符串始终是固定长度,因此您可以这样做:

DECLARE @s VARCHAR(50) = '01AAAA02BBBB03CCCC';

SELECT *
FROM
(
    SELECT SUBSTRING(@s, 01, 2) AS ID,  SUBSTRING(@s, 3, 4) AS Name
    UNION ALL
    SELECT SUBSTRING(@s, 7, 2) AS ID,  SUBSTRING(@s, 9, 4) AS Name
    UNION ALL
    SELECT SUBSTRING(@s, 13, 2) AS ID,  SUBSTRING(@s, 15, 4) AS Name
) t;

这会给你:

ID  Name
01  AAAA
02  BBBB
03  CCCC

更新:如果您想从表格的列中获取此字符串,可以执行以下操作:

DECLARE @t table(name varchar(50));
INSERT INTO @t VALUES
('01AAAA02BBBB03CCCC'),
('01DDDD02BBBB03CCCC'),
('01HHHH02QQQQ03CCCC'),
('01IIII02MMMM03CCCC');

SELECT *
FROM
(
    SELECT SUBSTRING(name, 1, 2) AS ID,  SUBSTRING(name, 3, 4) AS Name
    FROM @t
    UNION ALL
    SELECT SUBSTRING(name, 7, 2) AS ID,  SUBSTRING(name, 9, 4) AS Name
    FROM @t
    UNION ALL
    SELECT SUBSTRING(name, 13, 2) AS ID,  SUBSTRING(name, 15, 4) AS Name
    FROM @t
) t;

这将为您提供以下内容:

ID  Name
01  AAAA
01  DDDD
01  HHHH
01  IIII
02  BBBB
02  BBBB
02  QQQQ
02  MMMM
03  CCCC
03  CCCC
03  CCCC
03  CCCC

答案 1 :(得分:2)

以下将处理超过3个id / name对。但请注意,没有错误检查。我把它留给你。

DECLARE @Input NVARCHAR(18)
SET @Input = '01AAAA02BBBB03CCCC'

DECLARE @Data TABLE 
(
    [Id] NCHAR(2),
    [Name] NCHAR(4)
)

WHILE LEN(@Input) > 0
BEGIN

    DECLARE @CurrentData NCHAR(6)
    SET @CurrentData = LEFT(@Input, 6)  

    DECLARE @CurrentId NCHAR(2)
    SET @CurrentId = LEFT(@CurrentData, 2)  

    DECLARE @CurrentName NCHAR(4)
    SET @CurrentName = RIGHT(@CurrentData, 4)   

    INSERT INTO @Data
    (
        [Id],
        [Name]
    )
    SELECT
        @CurrentId,
        @CurrentName

    SET @Input = RIGHT(@Input, LEN(@Input) - 6)

END

SELECT 
    [Id],
    [Name]
FROM
    @Data