Обновить до столбца XML - PullRequest
0 голосов
/ 18 июня 2020

Попытка обновить столбец XML для менеджеров по продажам в таблице наших клиентов на SQL.

Формат столбца и его имя выглядят следующим образом:

<CustomColumnsCollection>
   <CustomColumn>
      <Name>ReceiveRebate</Name>
      <DataType>5</DataType>
      <Value>False</Value>
   </CustomColumn>
   <CustomColumn>
      <Name>Sales Manager</Name>
      <DataType>0</DataType>
      <Value>Ben Dover</Value>
   </CustomColumn>
   <CustomColumn>
      <Name>SurveyDate</Name>
      <DataType>1</DataType>
      <Value />
   </CustomColumn>
</CustomColumnsCollection>

Я пытаюсь обновить столбец значений менеджера по продажам, поэтому вместо Бена Дувра это будет, например, Гэри Шоу.

Пока что у меня есть это:

UPDATE Customers
SET CustomColumns.modify('replace value of 
(/CustomColumnsCollection/CustomColumn[@Name=("Sales Manager ")]/Value/text())[1] with ("Gary Shaw")
')
WHERE CustomerID = 'aptcustomerid'

Он работает успешно, но, похоже, ничего не делает, любые подсказки будут очень полезны.

1 Ответ

0 голосов
/ 18 июня 2020

Вот как это сделать.

(1) Выражение XPath было отключено. В XML атрибутов нет. <Name> - это элемент.

(2) Я добавил переменную SQL для гибкости, чтобы найти правильный XML фрагмент.

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, CustomColumns XML);
INSERT INTO @tbl ( CustomColumns) VALUES
(N'<CustomColumnsCollection>
   <CustomColumn>
      <Name>ReceiveRebate</Name>
      <DataType>5</DataType>
      <Value>False</Value>
   </CustomColumn>
   <CustomColumn>
      <Name>Sales Manager</Name>
      <DataType>0</DataType>
      <Value>Ben Dover</Value>
   </CustomColumn>
   <CustomColumn>
      <Name>SurveyDate</Name>
      <DataType>1</DataType>
      <Value />
   </CustomColumn>
</CustomColumnsCollection>');
-- DDL and sample data population, end

-- before
SELECT * FROM @tbl;

DECLARE @nameElement VARCHAR(30) = 'Sales Manager';

UPDATE @tbl
SET CustomColumns.modify('replace value of 
(/CustomColumnsCollection/CustomColumn[Name=sql:variable("@nameElement")]/Value/text())[1] 
with ("Gary Shaw")
');
--WHERE CustomerID = 'aptcustomerid'

-- after
SELECT * FROM @tbl;
...