Могу ли я выполнить поиск / замену в t-sql?

В основном у меня есть столбец xml, и мне нужно найти и заменить одно значение тега в каждой записи.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
25
0
21 237
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Чтобы найти содержимое в столбце XML, изучите метод exist (), как описано в MSDN здесь.

SELECT * FROM Table
WHERE XMLColumn.exist('/Root/MyElement') = 1

... для замены используйте метод modify (), как описано здесь.

SET XMLColumn.modify('
  replace value of (/Root/MyElement/text())[1]
  with "new value"
')

..все предполагается, что SqlServer 2005 или 2008. Это основано на XPath, о котором вам нужно знать.

update my_table
set xml_column = replace(xml_column, "old  value", "new value")

"Тип данных аргумента xml недопустим для аргумента 1 функции замены"

Phil Gan 28.07.2010 17:33
Ответ принят как подходящий

Для чего-то реального я бы пошел с xpaths, но иногда вам просто нужно быстрое и грязное решение:

Вы можете использовать CAST, чтобы превратить этот столбец xml в обычный varchar, а затем выполнить обычную замену.

UPDATE xmlTable SET xmlCol = REPLACE( CAST( xmlCol as varchar(max) ), '[search]', '[replace]')

Этот же метод также упрощает поиск в XML, когда вам нужно просто выполнить быстрый запрос, чтобы что-то найти, и вы не хотите иметь дело с xpath.

SELECT * FROM xmlTable WHERE CAST( xmlCol as varchar(max) ) LIKE '%found it!%'

Обновлено: просто хочу немного обновить это, если вы получите сообщение в строке Преобразование одного или нескольких символов из XML в целевое сопоставление невозможно, вам нужно только использовать nvarchar, который поддерживает Unicode.

CAST( xmlCol as nvarchar(max) )

@ Cory-Mawhorter Вы упомянули, что XPath будет "лучше". Как бы вы использовали XPath, чтобы что-то изменить в столбце XML?

Arminder Dahul 09.10.2015 12:05

@ArminderDahul Прошло время, но я думаю, вы можете сделать это, как set xmlCol.nodes('/somenode/someothernode[@id=sql:variable("@som‌​evar")]/text') = 'blah'. Не уверена. Ответ Майкла может помочь вам начать.

Cory Mawhorter 10.10.2015 21:18

Другие вопросы по теме