TSQL - необходимо запросить столбец базы данных, который заполнен XML - PullRequest
0 голосов
/ 25 августа 2018

TSQL - необходимо запросить столбец базы данных, который заполнен XML.

База данных имеет столбец iUserID с идентификатором приложения и ключом 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> 

Я хочу иметь возможность идентифицировать любой iUserID, в котором для StrValue для iDataID 5 и 6 не установлено значение True.

Я попытался использовать инструкцию txtValue Like%, но даже если я скопирую содержимое и запросу его дословно, это не приведет к результату, который заставит меня поверить, что данные XML не могут быть запрошены таким образом.

Снимок экрана запроса Select * для этой БД для справки

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Вы можете попробовать 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> фильтруется для идентификаторов фитингов, а <strValue> фильтруется для содержимого !="True". Это вернет любую строку данных, где есть хотя бы одна запись, с идентификатором 5 или 6 и значением, не равным «True».

0 голосов
/ 25 августа 2018

Таким образом, без примеров данных (включая теги; извините, у вас возникли проблемы с этим) сложно составить полный запрос, но вам нужен XQuery, в частности метод .exists в T-SQL.

Что-то вроде

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. Другими словами, если оба факта верны, вы не получите этот ряд обратно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...