【问题标题】:How to use XML input for Update / Set statement in SQL Server? [duplicate]如何在 SQL Server 中为更新/设置语句使用 XML 输入? [复制]
【发布时间】:2014-12-30 07:17:58
【问题描述】:

当我需要通过存储过程更新表时,我会使用以下内容,这通常对我有用(使用 SQL Server 2012):

UPDATE  LogTable
SET     title = @title,
        summary = @summary,
        post = @post,
        departmentID = @departmentID
WHERE   postID = @postID

但是,现在我的输入不是来自单个参数,而是 XML 输入的一部分(定义为 @xmlMain xml),而 postID 是一个单独的参数(定义为 @postID int)。

我试图在这里使用类似以下的内容,但不知道如何在此处应用 FROM 语句(类似于 FROM @xmlMain.nodes('/root') AS [Xml_Tab]([Cols]) ):

UPDATE  LogTable
SET     title = [Xml_Tab].[Cols].value('(title)[1]', 'nvarchar(100)'),
        summary = [Xml_Tab].[Cols].value('(summary)[1]', 'nvarchar(500)'),
        post = [Xml_Tab].[Cols].value('(post)[1]', 'nvarchar(max)'),
        departmentID = [Xml_Tab].[Cols].value('(departmentID)[1]', 'int')
WHERE   postID = @postID

我怎样才能正确地写这个?

【问题讨论】:

    标签: sql sql-server xml stored-procedures sql-update


    【解决方案1】:
    UPDATE A
    SET    title = b.title,
           summary = b.summary,
           post = b.post,
           departmentID = b.departmentID
    FROM   LogTable A
           JOIN (SELECT title=[Xml_Tab].[Cols].value('(title)[1]', 'nvarchar(100)'),
                        summary=[Xml_Tab].[Cols].value('(summary)[1]', 'nvarchar(500)'),
                        post=[Xml_Tab].[Cols].value('(post)[1]', 'nvarchar(max)'),
                        departmentID=[Xml_Tab].[Cols].value('(departmentID)[1]', 'int'),
                        PostID=[Xml_Tab].[Cols].value('(postID)[1]', 'int')
                 FROM   @xmlMain.nodes('/root') AS [Xml_Tab]([Cols]) ) B
             ON a.postID = b.postID 
    

    【讨论】:

    • 完美,有效!非常感谢您的快速回复。
    • @user2571510 这个答案和问题与stackoverflow.com/questions/27668766/…几乎相同
    • @NoDisplayName:谢谢和抱歉 - 我查看了其他问题和答案,但不确定我是否在这里得到了这个。对此深表歉意!
    【解决方案2】:

    尝试以下查询并检查它是否有效:

    UPDATE 
        LogTable
    SET 
        title = Temp.Cols.value('@title','nvarchar(100)'),
        summary = Temp.Cols.value('@summary', 'nvarchar(500)'),
        post = Temp.Cols.value('@post', 'nvarchar(max)'),
        departmentID = Temp.Cols.value('@departmentID', 'int')
    FROM 
        @xmlMain.nodes('/root/[YourXMLElementName]') AS Temp(Cols)
    WHERE 
        postID = Temp.Cols.value('@postID', 'INT')
    

    【讨论】:

    • 也非常感谢!
    【解决方案3】:

    如果您没有性能问题,您可以使用初始代码来更新您的日志,但只需像您在问题中所写的那样从新来源填充变量:

    SELECT  @title = [Xml_Tab].[Cols].value('(title)[1]', 'nvarchar(100)'),
            @summary = [Xml_Tab].[Cols].value('(summary)[1]', 'nvarchar(500)'),
            @posT = [Xml_Tab].[Cols].value('(post)[1]', 'nvarchar(max)'),
            @departmentID = [Xml_Tab].[Cols].value('(departmentID)[1]', 'int')
    FROM    @xmlMain.nodes('/root') AS [Xml_Tab]([Cols])
    
    -- Your original code
    UPDATE  LogTable
    SET     title = @title,
            summary = @summary,
            post = @post,
            departmentID = @departmentID
    WHERE   postID = @postID
    

    【讨论】:

    • 也非常感谢 - 性能方面我更喜欢这里的其他选项之一,但也很高兴知道这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    • 2018-02-18
    • 2021-02-19
    • 2018-07-19
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多