2008-09-09 119 views
49

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

任何想法?

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

回答

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

1

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

您可以让用户更新xml-data的一种方法是编写一个简单的基于.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 server management studio缺少此功能。

我可以看到荷马辛普森当微软项目经理 用手掌敲他的头: “杜!”

当然,我们要编辑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 

但是,我们绝对需要能够编辑。如果您正在倾听Soft先生,请看看Oracle,您可以在他们的Mgt Studio中编辑XML。让我们将其视为疏忽,我仍然是SQL服务器的巨大粉丝。

相关问题