【问题标题】:How to easily edit SQL XML column in SQL Management Studio如何在 SQL Management Studio 中轻松编辑 SQL XML 列
【发布时间】:2010-09-08 08:34:00
【问题描述】:

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

有什么想法吗?

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

【问题讨论】:

    标签: sql sql-server xml


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我有一个便宜又讨厌的解决方法,但没关系。所以,对记录进行查询,即

      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 Server 的忠实粉丝。

      【讨论】:

        【解决方案3】:

        忽略问题标题中的“简单”部分,这里有一个相当不错的巨型 hack,只要您处理小型 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 值。

        再一次,丑陋的黑客,但它可以满足我的需要。

        【讨论】:

          【解决方案4】:

          @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]
          

          【讨论】:

            【解决方案5】:

            这是一个老问题,但我今天需要这样做。我能想到的最好办法是编写一个查询,生成可以在查询编辑器中编辑的 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 更改为最大值以避免错误)

            【讨论】:

              【解决方案6】:

              sql server management studio 缺少此功能。

              我可以将 Homer Simpson 视为 Microsoft 项目经理 用手掌敲打他的头: “哼!”

              当然,我们要编辑 xml 列。

              【讨论】:

              • Microsoft 最新的数据库工具 Azure Data Studio 也缺少此功能。荷马又来了!
              【解决方案7】:

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

              edit:c#还包含简化读取/写入数据的xmldocument类。

              【讨论】:

                【解决方案8】:

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

                正如其他人所说,我认为编写一个小应用程序可能会更容易!

                【讨论】:

                • 我知道我可以写一个应用程序。我在问题中提到过:)直接在表格视图中编辑值有其好处。如果我可以为数字和字符串做,我也想为 XML 做。
                【解决方案9】:

                我认为您不能在不自己编写 UPDATE 命令的情况下使用 Management Studio GUI 来更新 XML 列。

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2013-03-27
                  • 1970-01-01
                  • 2011-02-12
                  • 1970-01-01
                  • 2010-12-04
                  • 2019-04-02
                  • 2020-05-14
                  • 2020-04-05
                  相关资源
                  最近更新 更多