У меня есть таблица с столбцом XML. В этом столбце хранятся некоторые значения, которые я сохраняю для настройки моего приложения. Я создал его, чтобы схема была более гибкой. Я не могу найти способ обновить этот столбец непосредственно из представления таблицы в SQL Management Studio. Другие столбцы (например, INT или Varchar) доступны для редактирования. Я знаю, что могу написать инструкцию UPDATE или создать код для ее обновления. Но я ищу что-то более гибкое, что позволит опытным пользователям напрямую редактировать XML.
Есть идеи?
Reiterating again: Please don't answer I can write an application. I know that, And that is exactly what I'm trying to avoid.


Я не думаю, что вы можете использовать графический интерфейс Management Studio для обновления XML-столбцов, не написав самостоятельно команду UPDATE.
Один из способов позволить пользователям обновлять xml-данные - написать простую программу на основе .net (winforms или asp.net), а затем выбрать / обновить данные оттуда. Таким образом, вы также можете дезинфицировать данные и легко проверить их на соответствие любой заданной схеме перед вставкой / обновлением информации.
Я закончил писать пользовательский интерфейс .net C# для работы с данными xml. Использование xsl для отображения и схемы xml помогло красиво отобразить xml и сохранить его целостность.
edit: Также C# содержит класс xmldocument, который упрощает чтение / запись данных.
Я немного не уверен в этом, но не могли бы вы использовать метод OPENXML, чтобы разбить XML в реляционный формат, а затем сохранить его обратно в XML, когда пользователь закончит?
Как уже говорили другие, я думаю, что было бы проще написать небольшое приложение для этого!
В студии управления сервером sql эта функция отсутствует.
Я вижу Гомера Симпсона как руководителя проекта Microsoft ударившись ладонью по голове: "Ага!"
Конечно, мы хотим редактировать столбцы xml.
В последнем средстве базы данных Microsoft, Azure Data Studio, также отсутствует эта функция. Гомер снова наносит удар!
Это старый вопрос, но мне нужно было сделать это сегодня. Лучшее, что я могу придумать, - это написать запрос, который генерирует код 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 на максимальное, чтобы избежать ошибки)
@ Ответ Джейкоба работает очень хорошо, хотя вы должны добавить 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]
Не обращая внимания на «легко» часть заголовка вопроса, вот гигантский прием, который будет довольно приличным, если вы имеете дело с небольшими столбцами 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.
Опять же, уродливый хакер, но он работает для того, что мне нужно.
У меня есть дешевый и неприятный способ обхода проблемы, но все в порядке. Итак, сделайте запрос записи, т.е.
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-сервера.
Еще один ответ без ответа. Вы можете использовать LinqPad. (https://www.linqpad.net/). Он имеет возможность редактировать строки SQL, включая поля XML. Вы также можете запросить строки, которые хотите редактировать, с помощью SQL, если вы не используете LINQ.
Моя конкретная проблема заключалась в попытке изменить пустое значение XML на значение NULL. В SSMS значение отображается как пустое. Однако в LinqPad он отображается как null. Поэтому в LinqPad мне пришлось изменить его на, а затем обратно на null, чтобы изменения были сохранены. Теперь SSMS тоже показывает это как null.
Я знаю, что могу написать приложение. Я упомянул об этом в вопросе :) Редактирование значений в табличном представлении напрямую имеет свои преимущества. Если я могу сделать это для чисел и строк, я хотел бы сделать это и для XML.