【问题标题】:Split fixed length string拆分固定长度字符串
【发布时间】:2012-09-26 23:31:58
【问题描述】:

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

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

字符串:01AAAA02BBBB03CCCC.

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

id 名称 01 AAA 02 BBBB 03 中交

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

有什么想法吗?

【问题讨论】:

  • 如果字符串是固定长度的,你怎么能有一个或多个记录?它是用空格填充的吗?字符串长度是多少?

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


【解决方案1】:

由于字符串的长度总是固定的,所以你可以这样做:

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

【讨论】:

  • 好的,谢谢!我不明白,但是从实际查询中获取列呢?此外,我不知道字符串中有多少条记录
  • @rgx71 您可以从表中的列名中替换@s,请参阅我的编辑。我更新了我的答案,向您展示了如何做到这一点。
  • @rgx71 不客气,顺便说一句,如果您觉得我的回答有帮助,请尝试accept it。这就是 Stackoverflow 中的工作方式。
【解决方案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

【讨论】:

  • 嗨,seth 花,我喜欢这个想法,我用字符串列表创建了一个查询,如果我需要应用你的解决方案,我应该创建一个函数并为每一行调用函数并执行插入?还是有另一种方法可以直接做到这一点?谢谢
  • 视情况而定,在不了解的情况下,我很难说。如果您需要从数据库中的多个位置拆分此数据,您可以创建一个函数来仅返回表变量。然后,您可以使用您认为合适的表变量中的数据。
  • 我要为之前的代码建一个sp,非常感谢大家!!!!!!
  • 我有一个错误,例如,如果我有这个字符串 '01AAAA02BBBB03CCCC' 结尾有空格,我应该考虑一下,也许我会在开头和结尾都有空格
  • 我知道问题出在 LEN() 函数上,但如果我使用 DATALENGTH 会更糟,是 len 的两倍......
猜你喜欢
  • 1970-01-01
  • 2015-03-12
  • 2012-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
相关资源
最近更新 更多