Рейтинг:
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.