Sql-Server

比較來自包含小數的 xml 節點的值

  • February 15, 2018

我需要比較儲存在 SQL Server 2014 上的記錄的兩個不同 XML 節點的值。

這是我將使用的 XML 列的內容:

<Document>
  <PolicyId>0</PolicyId>
  <ChangeAmount>1.4-</ChangeAmount>
  <PolicyTerm>
      <OutstandingBalance>35.04+</OutstandingBalance>
  </PolicyTerm>
  <OriginalCollectionAmount>36.44+</OriginalCollectionAmount>
</Document> 

這是我的 SQL 語句不起作用:

SELECT *
FROM   Table 
WHERE  QueueName ='.\private$\CollectionActivityPosted'
AND    Payload.value('(/Document/TransType)[1]', 'nvarchar(20)') = 'C'
AND    (Payload.value('(/Document/OutstandingBalance)[1]', 'nvarchar(20)') 
      <> 
      (Payload.value('(/Document/OriginalCollectionAmount)[1]', 'nvarchar(20)')))

我希望我的查詢會因為OutstandingBalance不等於而受到打擊,OriginalCollectionAmount但事實並非如此。

看起來你在 where 謂詞中有錯誤的路徑。如果我這樣做,它會起作用:

IF OBJECT_ID(N'dbo.x', N'U') IS NOT NULL
DROP TABLE dbo.x;
CREATE TABLE dbo.x
(
   xm xml
);
INSERT INTO dbo.x (xm)
SELECT N'<Document>
  <PolicyId>0</PolicyId>
 <ChangeAmount>1.4-</ChangeAmount>
 <PolicyTerm>
   <OutstandingBalance>35.04+</OutstandingBalance>
 </PolicyTerm>
 <OriginalCollectionAmount>36.44+</OriginalCollectionAmount>
</Document>';

SELECT x.xm.value('(/Document/PolicyTerm/OutstandingBalance)[1]', 'nvarchar(20)')
FROM dbo.x
╔══════════════════╗
║(無列名)║
╠══════════════════╣
║ 35.04+ ║
╚══════════════════╝

測試:

SELECT *
FROM dbo.x
WHERE (x.xm.value('(/Document/PolicyTerm/OutstandingBalance)[1]', 'nvarchar(20)') <>
    (x.xm.value('(/Document/OriginalCollectionAmount)[1]', 'nvarchar(20)')))
╔═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
║×米║
╠═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╣
║ <Document><PolicyId>0</PolicyId><ChangeAmount>1.4-</ChangeAmount><PolicyTerm><OutstandingBalance>35.04+</OutstandingBalance></PolicyTerm><OriginalCollectionAmount>36.44+</OriginalCollectionAmount></Document> ║
╚═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝

在您的程式碼中,Payload.value('(/Document/OutstandingBalance)[1]', 'nvarchar(20)')應該是Payload.value('(/Document/PolicyTerm/OutstandingBalance)[1]', 'nvarchar(20)')

引用自:https://dba.stackexchange.com/questions/198050