GOOGLE ADS

понедельник, 2 мая 2022 г.

Разделение поля строки T-SQL с помощью точки с запятой приводит к ошибке при разборе XML: строка 1, символ 49, недопустимый символ имени

Я использую SQL Server 2014. У меня есть адреса, хранящиеся таким образом, как одна большая строка в столбце, называемом addrв таблице tblAddress(у меня нет контроля над этим, это от стороннего поставщика)

addr
--------------------------------------------------
1 Smith Street;My Old Town; Someplace;Pluto;
5 SmokeyStreet;Someoldtown;Someotherplace;;
7 Grove Hill; Someolder town;Someotherplace;Earth

Я хотел бы извлечь его, чтобы он выглядел так, как показано ниже, разделенным на 4 столбца:

Addr1 Addr2 Addr3 Addr4
----------------------------------------------------------
1 Smith Street My Old Town Someplace Pluto
5 SmokeyStreet Someoldtown Someotherplace
7 Grove Hill Someolder town Someotherplace Earth

Я пробовал:

SELECT 
CAST('<x>' + REPLACE([addr], ';', '</x><x>') + '</x>' AS XML).value('/x[1]', 'nvarchar(50)') AS Addr1,
CAST('<x>' + REPLACE([addr], ';', '</x><x>') + '</x>' AS XML).value('/x[2]', 'nvarchar(50)') AS Addr2,
CAST('<x>' + REPLACE([addr], ';', '</x><x>') + '</x>' AS XML).value('/x[3]', 'nvarchar(50)') AS Addr3,
CAST('<x>' + REPLACE([addr], ';', '</x><x>') + '</x>' AS XML).value('/x[4]', 'nvarchar(50)') AS Addr4
FROM
tblAddress;

Но я продолжаю получать сообщение об ошибке:

Разбор XML: строка 1, символ 49, недопустимый символ имени

Где я ошибаюсь?


Решение проблемы

Вместо того, чтобы повторять вычисления, вы должны рассмотреть возможность использования CROSS APPLY один раз.

Пример

Select Pos1 = xDim.value('/x[1]','varchar(150)')
,Pos2 = xDim.value('/x[2]','varchar(150)')
,Pos3 = xDim.value('/x[3]','varchar(150)')
,Pos4 = xDim.value('/x[4]','varchar(150)')
From YourTable A
Cross Apply ( values (cast('<x>' + replace((Select replace(A.addr,';','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml)) )B(xDim)

Полученные результаты

Pos1 Pos2 Pos3 Pos4
1 Smith Street My Old Town Someplace Pluto
5 SmokeyStreet Someoldtown Someotherplace
7 Grove Hill Someolder town Someotherplace Earth

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...