我希望在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
启用全文索引来完成任何帮助
由于
答案 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
版本应该更快,但您想要针对您的数据集进行测试。