Разобрать столбец varchar, содержащий данные, подобные XML, в строку - PullRequest
2 голосов
/ 18 марта 2019

У меня есть столбец в таблице, который содержит такие данные, как XML, я хотел бы получить данные в строках.

Данные моей таблицы как-

select printDataColumn from Mytable 

Возвращает значение-

  <PrintData>
    <Line1>.MERCHANT ID: *****4005</Line1>
    <Line2>.CLERK ID: ADMIN</Line2>
    <Line3>.</Line3>
    <Line4>.                VOID SALE</Line4>
    <Line5>.</Line5>
    <Line6>.VISA                   ************0006</Line6>
    <Line7>.ENTRY METHOD: SWIPED</Line7>
    <Line8>.DATE: 03/05/2019  TIME: 16:57:20</Line8>
    <Line9>.</Line9>
    <Line10>.INVOICE: 1551785225020</Line10>
    <Line11>.REFERENCE: 1008</Line11>
    <Line12>.AUTH CODE: 08354A</Line12>
    <Line13>.</Line13>
    <Line14>.AMOUNT                       USD$ 1.14</Line14>
    <Line15>.                            ==========</Line15>
    <Line16>.TOTAL                        USD$ 1.14</Line16>
    <Line17>.</Line17>
    <Line18>.          APPROVED - THANK YOU</Line18>
    <Line19>.</Line19>
    <Line20>.I AGREE TO PAY THE ABOVE TOTAL AMOUNT</Line20>
    <Line21>.ACCORDING TO CARD ISSUER AGREEMENT</Line21>
    <Line22>.(MERCHANT AGREEMENT IF CREDIT VOUCHER)</Line22>
    <Line23>.</Line23>
    <Line24>.</Line24>
    <Line25>.</Line25>
    <Line26>.x_______________________________________</Line26>
    <Line27>.           Merchant Signature</Line27>
    <Line28>.</Line28>
  </PrintData>

но я хочу использовать эту информацию по-другому

MERCHANT ID: *****4005
CLERK ID: ADMIN

                  SALE

AMEX                    ***********1006
ENTRY METHOD: CHIP
DATE: 03/07/2019  TIME: 14:37:23

INVOICE: 1551949638173
REFERENCE: 1005
AUTH CODE: 040749. . . .  .and so on.

любая помощь заметна.

1 Ответ

2 голосов
/ 18 марта 2019

Помимо того факта, что всегда полезно использовать соответствующий тип для хранения ваших данных, вы можете использовать приведение на лету для использования ваших xml-like-data с методами XML:

DECLARE @tbl TABLE(ID INT IDENTITY,PrintData VARCHAR(4000));
INSERT INTO @tbl VALUES
('<PrintData>
    <Line1>.MERCHANT ID: *****4005</Line1>
    <Line2>.CLERK ID: ADMIN</Line2>
    <Line3>.</Line3>
    <Line4>.                VOID SALE</Line4>
    <!-- more lines -->
  </PrintData>');

  SELECT t.ID
        ,A.Casted.value(N'(/PrintData/Line1/text())[1]','nvarchar(max)') AS Line1
  FROM @tbl t
  CROSS APPLY(SELECT CAST(t.PrintData AS XML)) A(Casted);

В этом случае я использую CROSS APPLY, чтобы добавить столбец A.Casted к результирующему набору, который представляет собой приведенный к строке XML-код.

Это сломается в случае неправильного XML (конечно). Вы можете попробовать TRY_CAST вместо этого. Это вернет NULL, но скроет ошибки данных ...

Еще немного фона
Приведение к XML - довольно дорогая операция. Делать это всякий раз, когда вы хотите прочитать ваши данные, - это тяжелая нагрузка для вашего сервера. Кроме того, использование VARCHAR подвержено двум основным ошибкам:

  • Если есть иностранные символы, вы можете получить вопросительные знаки
  • Если XML недействителен, вы его не увидите - пока не воспользуетесь им.

Если возможно, попытайтесь изменить дизайн таблицы для использования собственного XML.

И еще один намек
Это плохой подход к элементам name-number (то же самое для столбцов). Вместо <Line1><Line2><Line3> лучше использовать <Line nr="1"><Line nr="2"><Line nr="3"> ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...