我有一个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>
有人对此有所了解吗?
答案 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>%'