我有一个包含XML列的表。此列存储了我为配置应用程序而保留的一些值。我创建它以拥有更灵活的架构。 我找不到直接从SQL Management Studio中的表视图更新此列的方法。其他(例如INT或Varchar)列是可编辑的。我知道我可以编写UPDATE语句或创建一些代码来更新它。但我正在寻找更灵活的东西,让高级用户直接编辑XML。
有什么想法吗?
再次重申:请不要回答 我可以写一个应用程序。我知道 那就是我的意思 试图避免。
答案 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。