Я измельчаю столбец 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-значений, похоже, требует постоянной строки. Во всяком случае, вокруг?
Хорошее горе! Это фантастика. Я не знал об этом использовании для '.value()'. Я предполагаю, что '.value()' оценивает все пути до тех пор, пока не найдет тот, который возвращает результат? –
@ajhuddy Я не знаю, как это оценивается. Он возвращает первое найденное значение, но я понятия не имею, оценивается ли каждое выражение до этого. –