Подтвердить что ты не робот

Как легко редактировать столбец XML XML в SQL Management Studio

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

Любые идеи?

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

4b9b3361

Ответ 1

Это старый вопрос, но мне нужно было сделать это сегодня. Лучшее, что я могу придумать, - написать запрос, который генерирует 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 на максимум, чтобы избежать ошибки)

Ответ 2

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

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

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

Ответ 3

Ответ на

@Jacob работает очень хорошо, хотя вы должны добавить REPLACE, если 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]

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

Игнорируя "легко" часть заголовка вопроса, вот гигантский взлом, который довольно приличный, если вы имеете дело с небольшими столбцами 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.

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

Ответ 8

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

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-сервера.