我在表中有一列,其中包含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.
任何帮助都是有意义的。
答案 0 :(得分:2)
除了使用适当的类型存储数据始终是一个好主意外,您还可以随时使用 cast 来使用 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。
还有一个提示
name-number 元素(对列相同)是一种不好的方法。最好使用<Line1><Line2><Line3>
...而不是<Line nr="1"><Line nr="2"><Line nr="3">