Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.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 拆分定长字符串_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql 拆分定长字符串

Sql 拆分定长字符串,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我需要在sql server中拆分一个字符串并将数据插入表中。 Te字符串是固定长度的,没有逗号分隔。在字符串中,我可以插入1条或多条记录,例如: id=2个字符 名称=4个字符 字符串:01AA02BBBB03CCCC 在本例中,我有3条记录要插入,我只能在字符串中插入一条或多条记录 身份证名称 01 AAAA 02 BBBB 03中交 我需要一种方法将此信息拆分为两列和三行。我想使用BCP实用程序,但我不确定,也许我需要拆分并生成一个文件,然后使用BCP 有什么想法吗?因为字符串总是固定长度

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

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

字符串:01AA02BBBB03CCCC

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

身份证名称 01 AAAA 02 BBBB 03中交

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


有什么想法吗?

因为字符串总是固定长度的,所以您可以这样做:

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;
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
02  BBBB
03  CCCC
更新:如果要从表的列中获取此字符串,可以执行以下操作:

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;
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

由于字符串始终为固定长度,因此可以执行以下操作:

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;
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
02  BBBB
03  CCCC
更新:如果要从表的列中获取此字符串,可以执行以下操作:

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;
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

以下内容将处理3个以上的id/名称对。但是请注意,没有错误检查。我把这个留给你

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

以下内容将处理3个以上的id/名称对。但是请注意,没有错误检查。我把这个留给你

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

如果字符串是固定长度的,您如何能拥有一条或多条记录?它是用空格填充的吗?字符串的长度是多少?如果字符串是固定长度的,您如何拥有一条或多条记录?它是用空格填充的吗?绳子的长度是多少?好的,谢谢!我不理解,但是从一个真实的查询中获取这个专栏呢?而且,我也不知道在未来的日子里我会有多少张唱片string@rgx71您可以从表中的列名替换@s,请参见我的编辑。我更新了我的答案,并向您展示了如何做到这一点。@rgx71不客气,顺便说一句,如果您觉得我的答案有帮助,请尝试。这就是Stackoverflow的工作原理。好的,谢谢!我不理解,但是从一个真实的查询中获取这个专栏呢?而且,我也不知道在未来的日子里我会有多少张唱片string@rgx71您可以从表中的列名替换@s,请参见我的编辑。我更新了我的答案,并向您展示了如何做到这一点。@rgx71不客气,顺便说一句,如果您觉得我的答案有帮助,请尝试。这就是Stackoverflow中的工作原理。嗨,seth flowers,我喜欢这个主意,我创建了一个带有字符串列表的查询,如果我需要应用您的解决方案,我是否应该创建一个函数并为每一行调用该函数并进行插入?还是有其他直接的方法?感谢取决于具体情况,如果不了解更多,我很难说。如果需要从数据库中的多个位置分割数据,可以创建一个函数来返回表变量。然后,您可以使用表变量中的数据,但是您认为合适。我将为前面的代码构建一个sp,非常感谢大家!!!!!我有一个错误,例如,如果我有一个字符串'01AAAA02BBBB03CCCC',末尾有空格,我应该考虑可能我会在开头和结尾都有空格,我知道问题是LEN函数,但是如果我使用DATALENGTH更糟糕,是LEN的两倍…嗨,seth flowers,我喜欢这个主意,我用字符串列表创建了一个查询,如果我需要应用您的解决方案,我是否应该创建一个函数并为每一行调用该函数并进行插入?还是有其他直接的方法?感谢取决于具体情况,如果不了解更多,我很难说。如果需要从数据库中的多个位置分割数据,可以创建一个函数来返回表变量。然后,您可以使用表变量中的数据,但是您认为合适。我将为前面的代码构建一个sp,非常感谢大家!!!!!我有一个错误,例如,如果我有一个字符串“01AAAA02BBBB03CCCC”,末尾有空格,我应该考虑可能我会在开头和结尾都有空格,我知道问题是LEN函数,但是如果我使用DATALENGTH更糟糕,是LEN的两倍。。。。