繁体   English   中英

将包含 XML 之类的数据的 varchar 列解析为行明智的

[英]Parse a varchar column containing XML like data into row wise

我在表中有一列包含 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.

任何帮助都是可观的。

除了使用适当的类型来存储数据始终是一个好主意这一事实之外,您还可以即时使用强制转换来将类似 xml 的数据与 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 APPLYA.CastedA.Casted到结果集,这是一个按行A.Casted转换的 XML。

在无效 XML(当然)的情况下,这将中断。 你可以试试TRY_CAST 这将返回NULL ,但会隐藏数据错误...

更多背景
转换为 XML 是一项相当昂贵的操作。 每当您想读取数据时执行此操作对您的服务器来说都是沉重的负担。 此外,使用VARCHAR容易出现两个主要错误:

  • 如果有外来字符,你可能会得到问号
  • 如果 XML 无效,您将不会看到它 - 直到您使用它。

如果可能,尝试更改表的设计以使用本机 XML。

还有一个提示
这是名称编号元素的一种糟糕方法(对于列也是如此)。 而不是<Line1><Line2><Line3>更好地使用<Line nr="1"><Line nr="2"><Line nr="3"> ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM