TSQL-需要查询由XML填充的数据库列。
数据库具有一个iUserID列,其中包含应用程序ID和VCKey
TxtValue是列名,并且包含的数据与此类似
<BasePreferencesDataSet xmlns="http://tempuri.org/BasePreferencesDataSet.xsd">
<ViewModesTable>
<iViewID>1</iViewID>
</ViewModesTable>
<ViewMode_PreferenceData>
<iViewID>1</iViewID>
<iDataID>0</iDataID>
<strValue>False</strValue>
</ViewMode_PreferenceData>
<ViewMode_PreferenceData>
<iViewID>1</iViewID>
<iDataID>5</iDataID>
<strValue>True</strValue>
</ViewMode_PreferenceData>
<ViewMode_PreferenceData>
<iViewID>1</iViewID>
<iDataID>6</iDataID>
<strValue>True</strValue>
</ViewMode_PreferenceData>
<ViewMode_PreferenceData>
<iViewID>1</iViewID>
<iDataID>4</iDataID>
<strValue>False</strValue>
我希望能够识别iDataID 5和6的StrValue未设置为True的任何iUserID。
我尝试使用txtValue Like%语句,但是即使我复制内容并逐字查询,也不会产生导致我相信无法以这种方式查询XML数据的结果。
答案 0 :(得分:1)
您可以将XML方法.exist()
与带有谓词的XPath
一起尝试:
WITH XMLNAMESPACES(DEFAULT 'http://tempuri.org/BasePreferencesDataSet.xsd')
SELECT *
FROM YourTable
WHERE CAST(txtValue AS XML).exist('/BasePreferencesDataSet
/ViewMode_PreferenceData[iDataID=5 or iDataID=6]
/strValue[text()!="True"]')=1;
需要命名空间声明来寻址没有命名空间前缀的元素。
<ViewMode_PreferenceData>
被过滤以得到合适的ID,而<strValue>
被过滤以得到内容!="True"
。这将返回任何包含至少一个条目的数据行,其ID为5或6,且值不等于“ True”。
答案 1 :(得分:0)
因此,没有示例数据(包括标签;抱歉,您遇到了麻烦),很难完成完整的查询,但是您要寻找的是XQuery,特别是T-SQL中的.exists方法
类似
SELECT iUserID
FROM tblLocalUserPreferences
WHERE iApplicationID = 30
AND vcKey='MonitorPreferences'
AND (txtValue.exist('//iDataID[text()="5"]/../strValue[text()="True"]') = 0
OR txtValue.exist('//iDataID[text()="6"]/../strValue[text()="True"]')=0)
这将返回iDataID 5或6不包含True的所有用户ID。换句话说,如果两者都正确,那么您将不会返回该行。