2014-10-15 2 views
2

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

DOCUMENTS 
____________________ 
DOCUMENTID int 
USERID  int 
CONTENT  text 

я следующий XML, хранящимся в столбце TEXT с именем СОДЕРЖАНИЯ в SQL Сервер базы данных

<?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> 

я найти способ, как запросить DINGLE атрибут 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

Типы данных 'ntext',' text' и 'image' будут удалены в будущей версии SQL Server. Избегайте использования этих типов данных в новых разработках и планируйте изменять приложения, которые в настоящее время их используют. Вместо этого используйте 'nvarchar (max)', 'varchar (max)' и 'varbinary (max)'. [См. Подробности здесь] (http://msdn.microsoft.com/en-us/library/ms187993.aspx) - вы должны ** преобразовать ** свой столбец в 'XML', а затем использовать его –

ответ

1

SQL Server не позволяет встроенного преобразования XML, что функции применяются, то есть: нет CAST(...).query(), используйте КТР для обработки преобразования:

;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 также являются on the way out. Если это новый код, используйте nvarchar(max)

+0

Проблема в том, что я может читать эту базу данных SQL, и я ничего не могу изменить ... даже для создания триггеров или представлений :(Язык является болгарским (похожим на русский), и из-за этого я добавляю некоторые в свой код «CAST (REPLACE (CAST (content AS NVARCHAR (MAX)), 'utf-8', 'utf-16') AS XML) '. Теперь все отлично! – RCancer

+0

И если это не самонадеянно, у меня возникает еще один вопрос: если возможно, то индекс узлов для использования узла name? Я имею в виду, если «Атрибутное имя» является «Число», чтобы принимать значения ... – RCancer