2008-09-09 3 views
49

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

Любые идеи?

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

ответ

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, а затем запустите запросы.

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

1

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

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

2

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

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

+1

Пожалуйста, если вы можете поделиться этим приложением .. – IsmailS 2011-04-01 10:41:27

0

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

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

+3

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

16

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

Я вижу Гомера Симпсона в качестве менеджера проекта Microsoft , ударяя головой по ладони: «Дух!»

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

+9

Вы имеете в виду «Doh!» ;) – AaronLS 2014-04-15 20:06:24

3

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

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

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

SELECT XMLData FROM [YourTable] 
WHERE ID = @SomeID 

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

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

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