SQL:如何通过过滤XML列中的值来查找行

时间:2018-01-29 08:39:32

标签: xml tsql xpath sql-server-2012 xquery

我有一个XML数据类型的字段,下面是我在该字段中保存的XML数据示例。现在,我想选择具有&#34; 1&#34;使用下面的查询在<SiteId>标记内,但没有结果出来。

SELECT [SettingsID]
      ,[XMLData]
FROM Settings
Where [XMLData].exist('/Settings/SiteId/text()[contains(.,"1")]') =1 


XMLDATA sample

<Settings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <SiteId>1</SiteId>
  <ModuleId xsi:nil="true" />
  <TabId xsi:nil="true" />
  <Version>0</Version>
</Settings>

有人对此有所了解吗?

2 个答案:

答案 0 :(得分:3)

你问题的标题是 - 可能 - 误导......

我认为您不是在寻找全文搜索,而是寻找适当的XQuery来查找具有给定条件的条目。

试试这个:

DECLARE @mockupTable TABLE(SettingsID INT IDENTITY, XMLData XML);
INSERT INTO @mockupTable VALUES
 (N'<Settings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <SiteId>1</SiteId>
  <ModuleId xsi:nil="true" />
  <TabId xsi:nil="true" />
  <Version>0</Version>
</Settings>')
,(N'<Settings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <SiteId>2</SiteId>
  <ModuleId xsi:nil="true" />
  <TabId xsi:nil="true" />
  <Version>0</Version>
</Settings>');

- 查询测试,如果有<SiteId>text()1

SELECT[SettingsID]
      ,[XMLData]
FROM @mockupTable
Where [XMLData].exist('/Settings/SiteId[text()="1"]') =1;

您只需使用1代替sql:variable("@SomeIntVariable")

即可将"1"引入查询
DECLARE @id INT=2;
SELECT[SettingsID]
      ,[XMLData]
FROM @mockupTable
Where [XMLData].exist('/Settings/SiteId[text()=sql:variable("@id")]') =1 

更新

要尽可能宽容地创建,您可以使用深度搜索//以及 *: 来省略任何名称空间:

SELECT[SettingsID]
      ,[XMLData]
FROM @mockupTable
Where [XMLData].exist('//*:SiteId[text()="1"]') =1;

答案 1 :(得分:0)

Mayby很傻,但是我理解你的问题很好,这可能会很好:

SELECT [SettingsID],[XMLData]
FROM Settings
Where [XMLData] LIKE '%<SiteId>1</SiteId>%'