2015-12-16 3 views
2

Я пытаюсь передать локальную переменную в функции XML.modify как узел в моем SQL-скрипте, так как xml, пытающийся быть измененным, является динамическим. См ниже кодИспользовать локальную переменную SQL для XML-узла

DECLARE 
    @XML VARCHAR(MAX) = 'ns:Messages/ns:T001.0_NewSPIDRequests/ns:T001.0_NewSPIDRequest/ns:D2009_SWConnectionRef' 

;WITH XMLNAMESPACES('urn:bridgeall-com:cmaservice:data:v3' AS ns) 
UPDATE XMLMessageFeeder 
SET theXML.modify('replace value of (/ns:Submission/*[local-name(.) = sql:variable("@XML")]/text())[1] with ("New Value")') 

SELECT theXML 
FROM XMLMessageFeeder 

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

SET theXML.modify 
      (' 
        replace value of (/ns:Submission/ns:Messages/ns:T001.0_NewSPIDRequests/ns:T001.0_NewSPIDRequest/ns:D2009_SWConnectionRef/text())[1] 
        with ("New Value") 
      ') 

Этот работает. По моим сведениям (это мало), они оба передают один и тот же код замены, но использование переменной, похоже, не работает.

Может кто-нибудь указать мне в правильном направлении?

EDIT Ответ можно найти ниже в комментариях.

ответ

1

local-name(.) возвращает имя текущего узла. Вы не можете использовать local-name(.) для сравнения с выражением пути. Только по одному узлу за раз.

+0

так что наличие всех узлов в пределах одной переменной в основном является тупиком? Я должен иметь несколько переменных, которые содержат каждый отдельный узел, который им нужен. EG 'Variable1 = T001.0_NewSPIDRequests, Variable2 = T001.0_NewSPIDRequest' и т. Д., То в пределах значения replace есть что-то вроде строк' (/ ns: Submission/ns: Messages/ns: * [local-name() = sql : variable ("@ Variable1")]/ns: * [local-name() = sql: variable ("@ Variable2")] ' – Blahwoo

+0

@Blahwoo Да. Вы можете сделать это с несколькими переменными, но вам нужно решить глубину (в вашем случае это выглядит как четыре). Разумеется, вы могли бы построить инструкцию обновления динамически и выполнить с помощью sp_executesql. Или, если имя конечного листового узла достаточно, чтобы найти нужный вам узел, вы можете использовать '// 'делать глубокий поиск узла. Что-то вроде' // * [local-name (.) = sql: ..... ' –

+1

Спасибо за это! Это очень помогло мне :) – Blahwoo

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