如何在SQL Management Studio中轻松编辑SQL XML列

我有一个XML列的表。 本专栏存储了一些值,用于configuration我的应用程序。 我创build它有一个更灵活的架构。 我无法find直接从SQL Management Studio中的表视图更新此列的方法。 其他(例如INT或Varchar)列是可编辑的。 我知道我可以写一个UPDATE语句或创build一些代码来更新它。 但是我正在寻找更灵活的东西,让高级用户直接编辑XML。

有任何想法吗?

再次重申:请不要回答我可以写一个应用程序。 我知道,那正是我想要避免的。

这是一个古老的问题,但我今天需要这样做。 我能想到的最好的方法是编写一个查询生成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 

然后,将结果窗口中的这些查询复制回查询窗口,编辑xmlstring,然后运行查询。

(编辑:将10更改为最大以避免错误)

SQL服务器pipe理工​​作室缺less这个function。

我可以看到荷马·辛普森(Homer Simpson)成为微软的项目经理,用手掌敲着脑袋:“呃!

当然,我们要编辑XML列。

@雅各布的答案很好,但如果你的XML包含任何字符,你应该添加一个REPLACE:

 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] 

我结束了写一个。NET C#UI来处理XML数据。 使用xsl进行显示和xml架构可以很好地显示xml并保持它的完整性。

编辑:另外c#包含简化读/写数据的xmldocument类。

我不认为你可以使用Management Studio GUI来更新XML列而无需自己编写UPDATE-command。

你可以让用户更新xml-data的一种方法是编写一个简单的基于.net的程序(winforms或asp.net),然后从那里select/更新数据。 这样,您也可以在插入/更新信息之前对数据进行清理,并根据给定的模式轻松validation数据。

我在这里有点模糊,但是你能否使用OPENXML方法将XML分解为关系数据格式,然后在用户完成后将其保存回XML中?

像其他人一样,我认为写一个小应用程序可能会更容易一些!

忽略问题标题的“容易”部分,这里是一个相当体面的巨人黑客,只要你处理小的XML列。

这是一个概念的certificate,没有太多的思考优化。 写在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 

如果在SSMS中打开vw_TableToUpdate,则可以更改“XML”,然后更新“真实”XML值。

再次,丑陋的黑客,但它适用于我需要做的事情。

我有一个便宜又讨厌的解决方法,但是没问题。 所以,做一个查询的logging,即

 SELECT XMLData FROM [YourTable] WHERE ID = @SomeID 

点击应该是“超链接”的xml数据字段。 这将在新窗口中打开XML。 编辑它,然后将XML复制并粘贴回新的查询窗口中:

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

但是,是的,我们绝望地需要能够编辑。 如果您正在监听Soft先生,请看看Oracle,您可以在他们的Mgt Studio中编辑XML。 让我们把它当成一个疏忽,我仍然是一个SQL服务器的巨大粉丝。