Sql-Server
比較來自包含小數的 xml 節點的值
我需要比較儲存在 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)')