Как обновить строку XML в столбце ntext в SQL Server? - PullRequest
2 голосов
/ 03 августа 2009

имеют таблицу SQL с 2 столбцами. ID (int) и значение (ntext)

Строки значений содержат всевозможные строки XML.

ID   Value
--   ------------------

1    <ROOT><Type current="TypeA"/></ROOT>
2    <XML><Name current="MyName"/><XML>
3    <TYPE><Colour current="Yellow"/><TYPE>
4    <TYPE><Colour current="Yellow" Size="Large"/><TYPE>
5    <TYPE><Colour current="Blue" Size="Large"/><TYPE>
6    <XML><Name current="Yellow"/><XML>

Как мне:

A. Перечислите строки, где

`<TYPE><Colour current="Yellow",`
    bearing in mind that there is an entry
    <XML><Name current="Yellow"/><XML>

B. Изменить строки, содержащие

<TYPE><Colour current="Yellow" to be
<TYPE><Colour current="Purple"

Спасибо! 4 ваша помощь

Ответы [ 2 ]

4 голосов
/ 03 августа 2009

В SQL Server 2005+, используя промежуточную временную таблицу:

DECLARE @q AS TABLE (xid INT NOT NULL, xdoc XML NOT NULL, modified TINYINT NOT NULL DEFAULT 0)

INSERT
INTO    @q (xid, xdoc)
SELECT  id, doc
FROM    mytable

UPDATE  @q
SET     xdoc.modify('replace value of (/TYPE/@Colour)[1] with "blue"'),
        modified = 1
WHERE   xdoc.value('(/TYPE/@Colour)[1]', 'NVARCHAR(MAX)') = 'Yellow'

UPDATE  mytable
SET     doc = CAST(xdoc AS NVARCHAR(MAX))
FROM    @q q
WHERE   id = q.xid
        AND q.modified = 1
1 голос
/ 03 августа 2009

Поскольку это поле NTEXT, к сожалению, вы не можете использовать обычные строковые функции.

Какую версию SQL Server вы используете ??

Если вы используете SQL Server 2005 или более позднюю версию, у вас есть два варианта:

  • вы можете привести ваш NTEXT к NVARCHAR (MAX), а затем вы можете использовать все обычные строковые функции, такие как REPLACE, SUBSTRING и так далее
  • вы можете преобразовать свой NTEXT в XML и использовать функции XML, доступные для SQL Server 2005

Первый вариант может выглядеть так:

UPDATE 
  YourTable
SET
  Value = CAST(REPLACE(CAST(Value as NVARCHAR(MAX)), 
                       'Colour="Yellow"', 'Colour="Blue"') AS NTEXT) 
WHERE
  .......

Второй вариант см. В ответе Квазного - однако, учтите: ваш XML немного странный .....

<TYPE><Colour="Yellow" Size="Large"></TYPE>

немного необычно и, на мой взгляд, неверно - либо «Цвет» является атрибутом <TYPE> тега

<TYPE Colour="Yellow" Size="Large"></TYPE>

или затем <Colour> сам по себе является тегом XML, но тогда «Желтый» должен быть назначен атрибуты:

<TYPE><Colour current="Yellow" Size="Large"></TYPE>

Вы не можете назначить значение непосредственно тегу XML, как это делается в вашем XML, ИМХО.

Если вы используете SQL Server 2000, все станет намного сложнее ....

Марк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...