Помимо того факта, что всегда полезно использовать соответствующий тип для хранения ваших данных, вы можете использовать приведение на лету для использования ваших 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">
...