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

时间:2008-09-09 22:14:26

标签: sql sql-server xml

我有一个包含XML列的表。此列存储了我为配置应用程序而保留的一些值。我创建它以拥有更灵活的架构。 我找不到直接从SQL Management Studio中的表视图更新此列的方法。其他(例如INT或Varchar)列是可编辑的。我知道我可以编写UPDATE语句或创建一些代码来更新它。但我正在寻找更灵活的东西,让高级用户直接编辑XML。

有什么想法吗?

  

再次重申:请不要回答   我可以写一个应用程序。我知道   那就是我的意思   试图避免。

9 个答案:

答案 0 :(得分:34)

这是一个老问题,但今天我需要这样做。我能想到的最好的方法是编写一个生成可以在查询编辑器中编辑的SQL代码的查询 - 它有点蹩脚,但它可以节省你的复制/粘贴内容。

注意:您可能需要进入工具>选项>查询结果>结果到文本并将显示的最大字符数设置为足够大的数字以适合您的XML字段。

e.g。

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改为最大以避免错误)

答案 1 :(得分:17)

sql server management studio缺少此功能。

我可以看到Homer Simpson担任微软项目经理 用手掌敲打头: “咄!”

当然,我们要编辑xml列。

答案 2 :(得分:3)

我最后写了一个.net c#UI来处理xml数据。使用xsl进行显示和xml架构有助于很好地显示xml并保持其完整性。

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

答案 3 :(得分:3)

@ Jacob的答案非常有效,但如果你的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]

答案 4 :(得分:0)

我认为您不必使用Management Studio GUI来更新XML列而无需自己编写UPDATE命令。

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

答案 5 :(得分:0)

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

就像其他人说的那样,我认为编写一个小应用程序可能更容易实现它!

答案 6 :(得分: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

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

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

答案 7 :(得分:0)

我有一个廉价而讨厌的解决方法,但还可以。因此,查询记录,即

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,您可以在他们的Mgt Studio中编辑XML。让我们把它归结为疏忽,我仍然是SQL服务器的巨大粉丝。

答案 8 :(得分:0)

另一个非答案的答案。你可以使用LinqPad。 (https://www.linqpad.net/)。它具有编辑SQL行的能力,包括XML字段。如果您没有进入LINQ,也可以通过SQL查询要编辑的行。

我的特殊问题是尝试将空XML值编辑为NULL值。在SSMS中,该值显示为空白。但是在LinqPad中它显示为null。因此在LinqPad中我必须将其更改为,然后返回null以便保存更改。现在SSMS也将其显示为null。