2012-05-23 3 views
0

Я измельчаю столбец xml в представлении и извлекаю информацию из этого столбца. В моем представлении в настоящее время запущен большой оператор CASE для локального имени ((*) [1], чтобы получить имя корневого узла в XML, а затем я сверля в xml для получения определенного значения на основе CASE .Параметр для метода значения xml через результат объединения

Например

CASE xdata.value('local-name((/*)[1])', 'sysname') 
WHEN 'Person' THEN xdata.value('(/*/PersonGuid/Personnel/@UserName)[1]', 'varchar(50)') 
WHEN 'Component' THEN xdata.value('(/*/ComponentGuid/Component/@Number)[1]', 'varchar(50)') 
END 

Этот случай утверждение является довольно большим и громоздким.

То, что я пытался сделать, это построить словарь в КТР, который содержит элемент Я оцениваю в CASE, а затем значение параметра, которое я хотел бы предоставить методу значения XML. Например, в примере выше словарь CTE будет содержать следующую информацию г (и КТР правильно вступил в основной внешний запрос):

;WITH CTE_Selector (TableName, Selector) AS 
(
SELECT 'Person', '(/*/PersonGuid/Personnel/@UserName)[1]' 
UNION SELECT 'Component' ,'(/*/ComponentGuid/Component/@Number)[1]' 
) 

Когда я пытаюсь использовать CTE, на мой взгляд, чтобы избежать случая заявление, например:

, xdata.value(CTE_Selector.Selector, 'varchar(50)') 

Я получаю следующая ошибка: Аргумент 1 метода данных типа XML «запрос» должен быть строковым литералом.

Итак, метод XML-значений, похоже, требует постоянной строки. Во всяком случае, вокруг?

ответ

1

Вы не можете использовать столбец или переменную вместо выражения XQuery. Вы можете использовать столбцы или переменные в выражении XQuery, но я не думаю, что это поможет вам в этой ситуации.

sql:column()
sql:variable()

Вы можете использовать только один вызов. value() вот так.

xdata.value('(
       /Person/PersonGuid/Personnel/@UserName, 
       /Component/ComponentGuid/Component/@Number 
      )[1]', 'varchar(50)') 
+0

Хорошее горе! Это фантастика. Я не знал об этом использовании для '.value()'. Я предполагаю, что '.value()' оценивает все пути до тех пор, пока не найдет тот, который возвращает результат? –

+0

@ajhuddy Я не знаю, как это оценивается. Он возвращает первое найденное значение, но я понятия не имею, оценивается ли каждое выражение до этого. –