xpertzgurtej Ответов: 1

Как обновить значение узла XML с новым значением в SQL server


напр.
Объявить таблицу @Employee(empXML XML);
Объявите @OldEmployeeId INT=103, @NewEmployeeId INT=999;

Вставить в @Employee VALUES('<root><Employee Id="100"/><Employee Id="102"/><Employee Id="103"/><Employee Id="104"/>')

Выберите * от @сотрудника

Я хочу обновить значение идентификатора сотрудника до 999, где идентификатор сотрудника =103.

Что я уже пробовал:

Я попробовал это сделать, но безуспешно.

Обновление @набор сотрудников
empXML.modify('заменить значение (ROOT/Employee/@Id)[1] на sql:переменную("@NewEmployeeId")')
Где empXML.value('(ROOT/Employee/@Id)[1]', 'INT') = @OldEmployeeId

1 Ответов

Рейтинг:
7

Richard Deeming

Ваш XML является недопустимым - в <root> узел не закрыт.

XML чувствителен к регистру. В вставленном XML-файле корневой элемент называется <root>, таким образом, запрос XPath для ROOT это не будет соответствовать ему.

Ваш WHERE предложение извлекает идентификатор объекта первый <Employee> узел, который является 100 Это не равносильно вашему @OldEmployeeId переменная, поэтому нет никаких строк для обновления.

Ваш replace value of оператор заменяет идентификатор объекта первый <Employee> узел, а это совсем не то, что вы пытаетесь сделать.

Измените свой UPDATE запрос к:

UPDATE @Employee 
SET empXML.modify('replace value of (root/Employee[@Id = sql:variable("@OldEmployeeId")]/@Id)[1] with sql:variable("@NewEmployeeId")')
WHERE empXML.exist('root/Employee[@Id = sql:variable("@OldEmployeeId")]') = 1;

заменить значение (XML DML)[^]
метод exist () (тип данных xml)[^]
Справочник По XPath[^]


xpertzgurtej

спасибо за вашу помощь..Это сработало так же, как я хочу..

Member 11996223

@Ричард считая - помогите мне, пожалуйста, на вопрос ниже от вашего решения?

empXML.изменить('заменить значение (корень/сотрудник[@идентификатор = SQL:переменная("@OldEmployeeId")]/@ИД)

есть ли какие-либо возможности для проверки состояния wild card? Я имею в виду, что у вас есть такое условие [@Id = sql:variable("@OldEmployeeId")]. его точное значение проверяется. Мне нужно, [@Id like %sql:variable("@OldEmployeeId")%].

Как справиться с этой ситуацией. Потому что у меня есть ценность с пробелами. другое дело, как обрезать.

Спасибо за поддержку.

Richard Deeming

Там, кажется, нет никакого Like оператор, но есть еще один contains функция:
содержит функцию (XQuery) - SQL Server | Microsoft Docs[^]

WHERE empXML.exist('root/Employee[contains(@Id, sql:variable("@OldEmployeeId"))]') = 1


Однако я не уверен, что это сделает то, что вы хотите. Если бы вы искали 42, он также будет возвращать записи с идентификатором 1422, например.

Возможно, вам придется "измельчить" XML и запустить поиск в SQL вместо этого.

Member 11996223

@Richard deeming, спасибо. Я проверю. надеюсь, это мне поможет.

Member 11996223

набор @xmld.изменить('заменить значение (/корневой/идентификация[содержит(возраст,SQL:переменная("@возраст"))]/название/текст())[1] С "123"')

пока я пытаюсь запустить код. я получаю ошибку типа,
"Язык XQuery [изменить()]: 'содержится()' требуется синглтон (или пустая последовательность), нашли операнд типа xdt': тип untypedatomic *'"

- пожалуйста, направьте меня на это

Richard Deeming

Эта ошибка будет означать, что вы пытаетесь изменить несколько элементов в документе; но это не будет соответствовать [1] в запросе.

Вы проверили, как выглядит фактический XML, который вы пытаетесь обновить?

Member 11996223

@Ричард, считая, помогите мне, пожалуйста ниже. В вашем вышеприведенном решении. В моем случае столбец проверки условий идет с пробелами. как обрезать это или как проверить для этого случая.

Пример:

UPDATE @Employee 
SET empXML.modify('replace value of (root/Employee[@Id = sql:variable("@OldEmployeeId")]/@Id)[1] with sql:variable("@NewEmployeeId")')
WHERE empXML.exist('root/Employee[@Id = sql:variable("@OldEmployeeId")]') = 1;


@Id - идет с ведущим пространством. Итак, мое условие провалилось. Пожалуйста, направьте меня, чтобы решить эту проблему.

Richard Deeming

Похоже, что нет возможности обрезать XML-значения в SQL, и нет никакой возможности обрезать XML-значения в SQL. "like" оператор. Если contains если это не сработает для вас, вам нужно будет "измельчить" XML и запустить поиск в SQL.