TSQL-需要查询由XML填充的数据库列

时间:2018-08-24 21:10:34

标签: sql sql-server xml tsql

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数据的结果。

Screenshot of Select * query for this DB for reference

2 个答案:

答案 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。换句话说,如果两者都正确,那么您将不会返回该行。