Как легко редактировать столбец SQL XML в SQL Management Studio - PullRequest
52 голосов
/ 10 сентября 2008

У меня есть таблица со столбцом XML. В этом столбце хранятся некоторые значения, которые я сохраняю для настройки своего приложения. Я создал его, чтобы иметь более гибкую схему. Я не могу найти способ обновить этот столбец непосредственно из табличного представления в SQL Management Studio. Другие (например, INT или Varchar) столбцы доступны для редактирования. Я знаю, что могу написать оператор UPDATE или создать некоторый код для его обновления. Но я ищу что-то более гибкое, что позволит опытным пользователям редактировать XML напрямую.

Есть идеи?

Повторяю еще раз: Пожалуйста, не отвечайте Я могу написать заявку. я знаю что, и это именно то, что я пытаясь избежать.

Ответы [ 9 ]

34 голосов
/ 12 января 2012

Это старый вопрос, но мне нужно было сделать это сегодня. Лучшее, что я могу придумать, - это написать запрос, который генерирует код SQL, который можно редактировать в редакторе запросов. Это неубедительно, но экономит ваши вещи при копировании / вставке.

Примечание: вам может потребоваться перейти в Инструменты> Параметры> Результаты запроса> Результаты в текст и установить максимальное количество отображаемых символов на достаточно большое число, чтобы соответствовать вашим полям XML.

, например

select 'update [table name] set [xml field name] = ''' + 
convert(varchar(max), [xml field name]) +
''' where [primary key name] = ' + 
convert(varchar(max), [primary key name]) from [table name]

, который выдает множество запросов, которые выглядят следующим образом (с некоторыми примерами имен таблиц / полей):

update thetable set thedata = '<root><name>Bob</name></root>' where thekey = 1

Затем вы копируете эти запросы из окна результатов обратно в окно запросов, редактируете строки xml и затем выполняете запросы.

(Изменить: изменено 10 на макс, чтобы избежать ошибки)

17 голосов
/ 13 августа 2010

SQL Server Студия управления сервером отсутствует эта функция.

Я вижу Гомера Симпсона руководителем проекта Microsoft стучит по голове ладонью: "Duh!"

Конечно, мы хотим редактировать столбцы xml.

3 голосов
/ 30 апреля 2013

@ Ответ Джейкоба работает очень хорошо, хотя вы должны добавить ЗАМЕНУ, если ваш XML содержит какие-либо символы:

select 'update [table name] set [xml field name] = ''' + 
REPLACE(convert(varchar(max), [xml field name]), '''', '''''') +
''' where [primary key name] = ' + 
convert(varchar(max), [primary key name]) from [table name]
3 голосов
/ 10 сентября 2008

Я закончил писать пользовательский интерфейс .net c # для работы с данными XML. Использование xsl для отображения и схема xml помогли красиво отобразить xml и сохранить его целостность.

edit: также c # содержит класс xmldocument, который упрощает чтение / запись данных.

0 голосов
/ 13 апреля 2018

Еще один ответ без ответа. Вы можете использовать LinqPad. (https://www.linqpad.net/). Он имеет возможность редактировать строки SQL, включая поля XML. Вы также можете запросить строки, которые хотите редактировать, с помощью SQL, если вы не в LINQ.

Моя конкретная проблема - попытка отредактировать пустое значение XML в значение NULL. В SSMS значение показывается как пустое. Однако в LinqPad он показывал как ноль. Поэтому в LinqPad мне пришлось изменить его на, а затем вернуть на ноль, чтобы сохранить изменения. Теперь SSMS также показывает это как ноль.

0 голосов
/ 09 июня 2016

У меня есть дешевый и неприятный обходной путь, но все в порядке. Итак, сделайте запрос записи, т.е.

SELECT XMLData FROM [YourTable]
WHERE ID = @SomeID

Нажмите на поле данных xml, которое должно быть «связано». Это откроет XML в новом окне. Отредактируйте его, затем скопируйте и вставьте XML обратно в новое окно запроса:

UPDATE [YourTable] SET XMLData = '<row><somefield1>Somedata</somefield1> 
                                  </row>'
WHERE ID = @SomeID

Но да, МЫ Отдельно нужно уметь редактировать. Если вы слушаете Mr. Soft, пожалуйста, посмотрите на Oracle, вы можете редактировать XML в их аналоге Mgt Studio. Давай объясним это недосмотром, я все еще ОГРОМНЫЙ поклонник SQL-сервера.

0 голосов
/ 23 апреля 2014

Игнорирование «легкой» части заголовка вопроса, вот гигантский хак, который довольно приличный, если вы имеете дело с небольшими колонками XML.

Это подтверждение концепции без особой мысли к оптимизации. Написано против 2008 R2.

--Drop any previously existing objects, so we can run this multiple times.
IF EXISTS (SELECT * FROM sysobjects WHERE Name = 'TableToUpdate')
    DROP TABLE TableToUpdate
IF EXISTS (SELECT * FROM sysobjects WHERE Name = 'vw_TableToUpdate')
    DROP VIEW vw_TableToUpdate

--Create our table with the XML column.
CREATE TABLE TableToUpdate(
    Id INT NOT NULL CONSTRAINT Pk_TableToUpdate PRIMARY KEY CLUSTERED IDENTITY(1,1),
    XmlData XML NULL
)

GO

--Create our view updatable view.
CREATE VIEW dbo.vw_TableToUpdate
AS
SELECT
    Id,
    CONVERT(VARCHAR(MAX), XmlData) AS XmlText,
    XmlData
FROM dbo.TableToUpdate

GO

--Create our trigger which takes the data keyed into a VARCHAR column and shims it into an XML format.
CREATE TRIGGER TR_TableToView_Update
ON dbo.vw_TableToUpdate
INSTEAD OF UPDATE

AS

SET NOCOUNT ON

DECLARE
@Id INT,
@XmlText VARCHAR(MAX)

DECLARE c CURSOR LOCAL STATIC FOR
SELECT Id, XmlText FROM inserted
OPEN c

FETCH NEXT FROM c INTO @Id, @XmlText
WHILE @@FETCH_STATUS = 0
BEGIN
    /*
    Slight limitation here.  We can't really do any error handling here because errors aren't really "allowed" in triggers.
    Ideally I would have liked to do a TRY/CATCH but meh.
    */
    UPDATE TableToUpdate
    SET
        XmlData = CONVERT(XML, @XmlText)
    WHERE
        Id = @Id

    FETCH NEXT FROM c INTO @Id, @XmlText
END

CLOSE c
DEALLOCATE c

GO

--Quick test before we go to SSMS
INSERT INTO TableToUpdate(XmlData) SELECT '<Node1/>'
UPDATE vw_TableToUpdate SET XmlText = '<Node1a/>'
SELECT * FROM TableToUpdate

Если вы откроете vw_TableToUpdate в SSMS, вам будет разрешено изменить «XML», что затем обновит «реальное» значение XML.

Опять уродливый хак, но он работает для того, что мне нужно.

0 голосов
/ 10 сентября 2008

Я немного неясен в этом вопросе, но не могли бы вы использовать метод OPENXML, чтобы измельчить XML в реляционный формат, а затем сохранить его обратно в XML после завершения работы пользователя?

Как и другие говорили, я думаю, что для этого было бы проще написать небольшое приложение!

0 голосов
/ 10 сентября 2008

Я не думаю, что вы можете использовать графический интерфейс Management Studio для обновления XML-столбцов без написания команды UPDATE самостоятельно.

Один из способов позволить пользователям обновлять xml-данные - это написать простую программу на основе .net (winforms или asp.net) и затем выбрать / обновить данные оттуда. Таким образом, вы также можете санировать данные и легко проверять их по любой заданной схеме перед вставкой / обновлением информации.

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