2016-12-13 3 views
3

У меня есть база данных, в которой хранятся результаты форм в столбце XML. К сожалению, он также сохраняет некоторые дополнительные символы в начале, которые не могут быть непосредственно проанализированы, поэтому мне нужно удалить их до разбора значений. Другое ограничение, которое у меня есть, заключается в том, что система, которую я использую для отображения отчетов (Xtraction), позволяет запускать подзапросы.Возврат выбранного значения из раскрывающегося списка XML в подзапросе SQL

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

Поскольку формы очень большой, я удалил все, кроме дополнительных символов и разделе выпадающего ниже XML:

_RCFM*=.hÞ<form><select id="Dropdown01" label="Substantive APS Level:" 
mandatory="true" readonly="false" style="combo" type="string" 
visible="true">EL1<option label=""/><option 
label="APS5">APS5</option><option label="APS6">APS6</option><option 
label="EL1">EL1</option></select></form> 

Суб запрос я использую:

(SELECT 
x.CARTITEMID 
, x.DROPDOWN01 
FROM (
SELECT 
    CARTITEMID 
    , CAST(RIGHT(cast(cast(SVCCARTITEMM1.OPTIONS as varbinary(max)) as varchar(max)), 
    LEN(cast(cast(SVCCARTITEMM1.OPTIONS as varbinary(max)) as varchar(max))) 
    -CHARINDEX('<form>',cast(cast(SVCCARTITEMM1.OPTIONS as varbinary(max)) as varchar(max)))+1) 
    AS XML).value('(/form/select[@id="Dropdown01"])[1]', 'varchar(max)')[DROPDOWN01] 

FROM SVCCARTITEMM1) x 
) 

В результате вышеуказанного подзапроса: EL1APS5APS6EL1

Мне нужно вернуть только выбранный текст, в этом случае начальный «EL1» из строка.

Обратите внимание, что код от CAST до «AS XML» - это место, где обычно используется ссылка на поле, и это то, что я использовал для преобразования и удаления упомянутых ведущих символов.

Пожалуйста, помогите, я действительно попытался найти решение этой довольно неясной проблемы.

+0

Каков тип данных 'SVCCARTITEMM1.OPTIONS'? – Shnugo

ответ

0

Укажите узел text() в выражении XQuery.

(/form/select[@id="Dropdown01"]/text())[1] 
1

Значение узла - это весь контент. Попробуйте следующее:

DECLARE @x XML= 
'<x>hallo1 
    <a>testa</a> 
    hallo2 
    <b>testb</b> 
    hallo3 
</x>'; 

SELECT x.value('.','nvarchar(max)') AS EntireContent 
     ,x.value('(./text())[1]','nvarchar(max)') AS FirstText 
     ,x.value('(./text())[2]','nvarchar(max)') AS SecondText 
     ,x.value('(./a)[1]','nvarchar(max)') AS DeeperNode --might use `text()` here as well 
FROM @x.nodes('/x') AS A(x); 

Вы не указали тип данных столбца. Как есть ведущие символы это не может быть XML. Ваш код дайте мне подумать, что это какой-то текст. Я думаю, что весь ваш запрос может быть упрощен:

DECLARE @YourTbl TABLE(OPTIONS NVARCHAR(MAX)); 
INSERT INTO @YourTbl VALUES 
(N'_RCFM*=.hÞ<form><select id="Dropdown01" label="Substantive APS Level:" 
mandatory="true" readonly="false" style="combo" type="string" 
visible="true">EL1<option label=""/><option 
label="APS5">APS5</option><option label="APS6">APS6</option><option 
label="EL1">EL1</option></select></form>'); 

SELECT Casted.value(N'(/form/select[@id="Dropdown01"]/text())[1]','nvarchar(max)') 
FROM @YourTbl AS t 
CROSS APPLY(SELECT CAST(SUBSTRING(t.OPTIONS,CHARINDEX('<',t.OPTIONS),10000) AS XML)) AS A(Casted) 

Если тип данных в столбце были IMAGE или TEXT (не рекомендуется в течение более 10 лет, но другой выбор ваш код может указывать), попробуйте следующее:

SELECT AsXML.value(N'(/form/select[@id="Dropdown01"]/text())[1]','nvarchar(max)') 
FROM @YourTbl AS t 
CROSS APPLY(SELECT CAST(CAST(t.OPTIONS AS VARBINARY(MAX)) AS VARCHAR(MAX))) AS A(AsString) 
CROSS APPLY(SELECT CAST(SUBSTRING(AsString,CHARINDEX('<',AsString),10000) AS XML)) AS B(AsXML) 

Внимание Если второй выдает ошибку, как недопустимого символа, попробуйте использовать NVARCHAR в первом CROSS APPLY в месте AS VARCHAR.

 Смежные вопросы

  • Нет связанных вопросов^_^