Мне нужно разделить таблицу, в которой поле идентификатора повторяется несколько раз. Точка с запятой будет служить разделителем. Это динамический набор данных, в котором «встроенный» столбец является динамическим. Строитель имеет многолетний опыт работы, поэтому мы не можем использовать ограничитель фиксированной позиции. Вот пример данных.
---- Sample data
CREATE TABLE TEST1
(
ID varchar(20),
FIELD varchar(max)
);
INSERT INTO TEST1 (ID, FIELD)
VALUES
('ERIC','BUILT;1995/PROPERTY;House/TYPE;OZ C1/BUILT;2010/PROPERTY;Condo/TYPE;F4/BUILT;2010/PROPERTY;Condo/TYPE;F9/'),
('ERIC','BUILT;1996/PROPERTY;House/TYPE;OZ C1/'),
('ERIC','BUILT;1997/PROPERTY;House/TYPE;OZ C1/'),
('ERIC','BUILT;2011/PROPERTY;Condo/TYPE;F4/BUILT;2015/PROPERTY;House/TYPE;C5/');
Это конечный результат, к которому я стремлюсь: с идентификатором, встроенным, свойством и типом в виде заголовков столбцов и данных, представленных вертикально.
ID BUILT PROPERTY TYPE
--------------------------------
ERIC 1995 House OZ C1
ERIC 2010 Condo F4
ERIC 2010 Condo F9
ERIC 1996 House OZ C1
ERIC 1997 House OZ C1
ERIC 2011 Condo F4
ERIC 2015 House C5
Мне известен следующий способ разбиения на столбцы. Однако это не то, что мне нужно. Это разделит данные по горизонтали, и мне нужно это по вертикали.
WITH Split_Fields (ID, xmlfields)
AS
(
SELECT ID ,
CONVERT(XML,'<Fields><field>'
+ REPLACE(name,'.', '</field><field>') + '</field></Fields>') AS xmlfields
FROM TEST1
)
SELECT ID
,xmlfields.value('/Fields[1]/field[1]';'varchar(100)') AS Field1
,xmlfields.value('/Fields[1]/field[2]';'varchar(100)') AS Field2
,xmlfields.value('/Fields[1]/field[3]';'varchar(100)') AS Field3
,xmlfields.value('/Fields[1]/field[4]';'varchar(100)') AS Field4
,xmlfields.value('/Fields[1]/field[5]';'varchar(100)') AS Field5
FROM Split_Fields
Я просмотрел SO, но не смог найти что-нибудь о разделении данных так, как мне нужно. Пожалуйста, кто-нибудь, помогите мне с этим. Я действительно застрял на этом.
Я успешно добавил '|' в качестве разделителей, чтобы указать, где начинается новая строка, как предложил Шон. Я боюсь, что из-за ограниченных данных у меня не получится сделать больше. Вот новый пример данных.
---- Sample data
CREATE TABLE TEST1
(
ID varchar(20),
FIELD varchar(max)
);
INSERT INTO TEST1 (ID, FIELD)
VALUES
('ERIC','BUILT;1995/PROPERTY;House/TYPE;OZ C1|BUILT;2010/PROPERTY;Condo/TYPE;F4|BUILT;2010/PROPERTY;Condo/TYPE;F9|'),
('ERIC','BUILT;1996/PROPERTY;House/TYPE;OZ C1|'),
('ERIC','BUILT;1997/PROPERTY;House/TYPE;OZ C1|'),
('ERIC','BUILT;2011/PROPERTY;Condo/TYPE;F4|BUILT;2015/PROPERTY;House/TYPE;C5|');
Simran