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