1

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

id = 2 个字符 名称 = 4 个字符

字符串:01AAAA02BBBB03CCCC

在此示例中,我要插入 3 条记录(字符串中只能有一条或多条记录)

id 名称 01 AAAA 02 BBBB 03 CCCC

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

任何的想法?

4

2 回答 2

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
于 2012-09-26T15:05:23.893 回答
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
于 2012-09-26T15:13:16.647 回答