Как я могу запросить значение в столбце ТЕКСТ SQL Server, который содержит XML (не тип столбца xml)

У меня есть таблица ДОКУМЕНТОВ с:

DOCUMENTS
____________________
DOCUMENTID   int
USERID       int
CONTENT      text

У меня есть следующий XML, хранящийся в столбце TEXT с именем CONTENT в базе данных SQL Server

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<IDMSDocument>
    <DocumentContent>
        <Attribute Name="Number" GUID="{FFFFFFFF-0000-0000-0000-000000000001}">
            <IDMSType>3060</IDMSType>
            <Value Type="Integer">
                <Value>122</Value>
            </Value>
        </Attribute>
        <Attribute Name="Date" GUID="{FFFFFFFF-0000-0000-0000-000000000002}">
            <IDMSType>3061</IDMSType>
            <Value Type="DateTime">
                <Date>10-09-2014</Date>
            </Value>
        </Attribute>
        <Attribute Name="Публикуване" GUID="{CA646F55-5229-4FC5-AA27-494B25023F4E}">
            <IDMSType>3062</IDMSType>
            <Value Type="String">
                <Value>Да</Value>
            </Value>
        </Attribute>
        <Attribute Name="Дата" GUID="{AC0465B0-4FB4-49E2-B4FA-70901068FD9B}">
            <IDMSType>3063</IDMSType>
            <Value Type="DateTime">
                <Date>01-10-2014</Date>
            </Value>
        </Attribute>
        <Attribute Name="Предмет на поръчка" GUID="{04A4EC72-6F33-461F-98DD-D8D271997788}">
            <IDMSType>3065</IDMSType>
            <Value Type="String">
                <Value>Избор на консултанти</Value>
            </Value>
        </Attribute>
    </DocumentContent>
</IDMSDocument>

Я нашел способ, как запросить отдельный XML-атрибут в одной строке таблицы, с тяжелым преобразованием:

DECLARE @strContent NVARCHAR(MAX);
DECLARE @xmlContent XML;
SET @strContent = (select content from DOCUMENTS where DocumentID=24);
SET @xmlContent = CAST(REPLACE(CAST(@strContent AS NVARCHAR(MAX)),'utf-8','utf-16') AS XML) 
SELECT @xmlContent.query('/IDMSDocument/DocumentContent/Attribute[5]/Value/Value') 
where @xmlContent.value('(/IDMSDocument/DocumentContent/Attribute[5]/Value/Value)[1]', 'nvarchar(max)') like '%search%'

Мне нужно сделать запрос типа "выбрать все строки в таблице, которые в пятом атрибуте в XML имеют значение" поиск ""

Для меня общая проблема заключается в том, что тип столбца не является XML, но у меня есть текстовый столбец с хранимым xml внутри. когда я пытаюсь привести приведение, запрос, значение непосредственно к серверу, я могу использовать его только со столбцом XML.

Буду очень признателен, если кто-нибудь подскажет, как это сделать!

Спасибо!

Камен

1 ответ

Решение

SQL Server не позволяет встроенным преобразованиям XML применять функции, т. Е. Нет CAST(...).query()используйте CTE для обработки преобразования:

;WITH cte AS (
  SELECT DocumentID, UserID, CAST(Content AS XML) AS XMLContent
  FROM Documents
)

SELECT XMLContent.query('/IDMSDocument/DocumentContent/Attribute[5]/Value/Value') 
FROM cte
WHERE XMLContent.value('(/IDMSDocument/DocumentContent/Attribute[5]/Value/Value)[1]', 'nvarchar(max)') like '%search%'

Хотя одно: я видел символы Unicode (русский?) В Content колонка. Может быть лучше использовать utf-16 в вашем XML и ntext для типа столбца.

text а также ntext также на выходе. Если это новый код, используйте nvarchar(max)

Другие вопросы по тегам