разбиение строки

Galagenka
Дата: 21.01.2013 11:26:16
Доброго времени суток!!!
Есть таблица, в которой хранятся данные с адресами.
Есть ячейка с адресом вида <Индекс,Регион,Область,Город,Населенный пункт,Улица,Дом,Корпус>, нужно разбить данную ячейку на 8 ячеек знак разделения запятая. Как это можно сделать?
Гость333
Дата: 21.01.2013 11:57:50
declare @address table (id int, concat_address varchar(1000));
insert @address values (1, 'Индекс,Регион,Область,Город,Населенный пункт,Улица,Дом,Корпус');
insert @address values (2, 'Индекс 2,Регион 2,Область 2,Город 2, Населенный пункт 2,Улица 2,Дом 2,Корпус 2');
insert @address values (3, 'Индекс 3,Регион 3,Область 3,Город 3,,Улица 3,Дом 3');
insert @address values (4, 'И"н&д<ек''с 4>,,');
insert @address values (5, '');
insert @address values (6, null);
insert @address values (7, 'Индекс 7,Регион 7,Область 7,Город 7, Населенный пункт 7,Улица 7,Дом 7,Корпус 7,Неведомая фигня 7');

select a.id, a.concat_address,
       t.xml_value.value('(/items/item)[1]', 'varchar(1000)') as [Индекс],
       t.xml_value.value('(/items/item)[2]', 'varchar(1000)') as [Регион],
       t.xml_value.value('(/items/item)[3]', 'varchar(1000)') as [Область],
       t.xml_value.value('(/items/item)[4]', 'varchar(1000)') as [Город],
       t.xml_value.value('(/items/item)[5]', 'varchar(1000)') as [Населенный пункт],
       t.xml_value.value('(/items/item)[6]', 'varchar(1000)') as [Улица],
       t.xml_value.value('(/items/item)[7]', 'varchar(1000)') as [Дом],
       t.xml_value.value('(/items/item)[8]', 'varchar(1000)') as [Корпус]
from @address a
     cross apply
     (  select cast
               (  '<items> <item>' +
                  replace
                  (  -- Замена спецсимволов XML
                     replace(replace(replace(a.concat_address, '&', '&amp;'), '>', '&gt;'), '<', '&lt;'),
                     ',', '</item> <item>'
                  ) +
                  '</item> </items>' as xml
                ) as xml_value
      ) t
Galagenka
Дата: 23.01.2013 17:50:24
Спасибо за помощь, получилось как-то так. Можно закрывать
--drop table TestTable
create table TestTable
( mfid int
, fname nvarchar(100)
, val nvarchar(100)
)
insert into TestTable
SELECT distinct mfid,fname,faddress
from table
select a.mfid, a.fname,NewTable.*
from dbo.TestTable a
cross apply ( select faddress = val + ',,,,,,,,' ) f1
cross apply ( select p1 = charindex( ',', faddress ) ) p1
cross apply ( select p2 = charindex( ',', faddress, p1 + 1 ) ) p2
cross apply ( select p3 = charindex( ',', faddress, p2 + 1 ) ) p3
cross apply ( select p4 = charindex( ',', faddress, p3 + 1 ) ) p4
cross apply ( select p5 = charindex( ',', faddress, p4 + 1 ) ) p5
cross apply ( select p6 = charindex( ',', faddress, p5 + 1 ) ) p6
cross apply ( select p7 = charindex( ',', faddress, p6 + 1 ) ) p7
cross apply ( select p8 = charindex( ',', faddress, p7 + 1 ) ) p8
cross apply ( select 'Индекс' = substring( faddress, 1, p1-1 )
, 'Регион' = substring( faddress, p1+1, p2-p1-1 )
, 'Район' = substring( faddress, p2+1, p3-p2-1 )
, 'Город' = substring( faddress, p3+1, p4-p3-1 )
, 'Населенный пункт' = substring( faddress, p4+1, p5-p4-1 )
, 'Улица' = substring( faddress, p5+1, p6-p5-1 )
, 'Дом' = substring( faddress, p6+1, p7-p6-1 )
, 'Корпус' = substring( faddress, p7+1, p8-p7-1 )
) NewTable