我需要在sql server中拆分一个字符串并将数据插入表中。 Te字符串是固定长度,没有逗号分隔。在字符串中,我可以插入1个或多个记录,例如:
id = 2个字符 name = 4个字符
字符串:01AAAA02BBBB03CCCC
。
在这个例子中我有3个要插入的记录(我在字符串中只能有一个或多个记录)
id名称 01 AAAA 02 BBBB 03 CCCC
我需要一种方法将这些信息拆分为两个不同的列和三个不同的行。我想使用BCP实用程序,但我不确定,也许我需要拆分并生成一个文件然后使用BCP。
有什么想法吗?
答案 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