在XML列中搜索值/字符串

时间:2014-07-03 15:17:08

标签: sql sql-server xml

我希望在SQL BatchProcessedClaims表中搜索名为ClaimData的XML列。

CREATE TABLE [dbo].[BatchProcessedClaims](
    [Id] [int] NOT NULL,
    [Im] [varchar](50) NULL,
    [ClaimData] [xml] NULL
) ON [PRIMARY]

以下是一个单元格中包含的值

<BGMSG>
<HEADER COMPLETION="Batch_22e3bc5f-d130-4a28-b078-4f3416360a35">
<ROUTING_SLIP>
<RECIPIENT Channel=".\private$\q_amb_leg" Delivered="1" DeliveryTime="2014-06-21T16:40:07.298" />
  <RECIPIENT Channel=".\private$\22e3bc5f-d130-4a28-b078-4f3416360a35" Delivered="0" />
</ROUTING_SLIP>
</HEADER>
</BGMSG>

我正在使用“Batch_22e3bc5f-d130-4a28-b078-4f3416360a35”搜索所有记录。我正在尝试3种不同的方式 方法1

SELECT TOP 10 *
FROM [BATCHES].[dbo].[BatchProcessedClaims]
WHERE ClaimData.value('(/BGMSG/HEADER)[1]', 'nvarchar(max)') LIKE 'Batch_22e3bc5f-d130-4a28-b078-4f3416360a35'

方法2

SELECT TOP 10 ClaimData.query('/BGMSG/HEADER[@COMPLETION="Batch_22e3bc5f-d130-4a28-b078-4f3416360a35"]')
FROM [BATCHES].[dbo].[BatchProcessedClaims]

方法3

SELECT top 10 *
FROM (
    SELECT pref.value('(text())[1]', 'varchar(75)') AS Batchname
    FROM BatchProcessedClaims
    CROSS APPLY ClaimData.nodes('/BGMSG/HEADER') AS ClaimData(pref)
    ) AS Result
WHERE Batchname LIKE 'Batch_22e3bc5f-d130-4a28-b078-4f3416360a35'

方法1运行6分钟,方法3运行13分钟,没有结果,方法2给出10条空白记录作为结果。我做错了什么

我尝试了方法4

SELECT top 10 * 
FROM   BatchProcessedClaims 
WHERE  CONTAINS(ClaimData,'Batch_22e3bc5f-d130-4a28-b078-4f3416360a35') 
AND    xCol.exist('/BGMSG/HEADER/text()[contains(.,"Batch_22e3bc5f-d130-4a28-b078-4f3416360a35")]') =1

但我目前没有全文索引,我得到一个错误 “Msg 7601,Level 16,State 2,Line 1 无法在表或索引视图'BatchProcessedClaims'上使用CONTAINS或FREETEXT谓词,因为它不是全文索引的。“

我试图通过方法1到3

启用全文索引来完成

任何帮助

由于

1 个答案:

答案 0 :(得分:2)

其中任何一个都应该相当有效:

select top 10 * from BatchProcessedClaims
where claimdata.value('(/BGMSG/HEADER/@COMPLETION)[1]', 'nvarchar(max)') = 'Batch_22e3bc5f-d130-4a28-b078-4f3416360a35'

OR

select top 10 * from BatchProcessedClaims
where claimdata.exist('/BGMSG/HEADER[@COMPLETION[1] = "Batch_22e3bc5f-d130-4a28-b078-4f3416360a35"]') = 1

exist版本应该更快,但您想要针对您的数据集进行测试。