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

У меня есть таблица с столбцом 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.

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

Ответы 9

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

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

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

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

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

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

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

Ron Harlev 10.09.2008 03:29

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

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

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

В последнем средстве базы данных Microsoft, Azure Data Studio, также отсутствует эта функция. Гомер снова наносит удар!

HBCondo 30.01.2021 10:32
Ответ принят как подходящий

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

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