【问题标题】:How to use Update statement with XML input in SQL Server?如何在 SQL Server 中使用带有 XML 输入的 Update 语句?
【发布时间】:2014-09-23 18:21:36
【问题描述】:

我使用 SQL Server 2008 并有一个存储过程,其中一个输入参数格式为 XML。此 XML 是一个名称列表,每个名称一个单词,没有空格。

对于这些名称中的每一个,我想检查它们是否已经存在于表中,如果没有,则应将它们添加到表中,如果是,则应在表中更新它们。

到目前为止,如果它们尚不存在,我可以添加它们,这可以按预期工作,但我不知道如何实现更新部分。

只是为了演示,这将是作为独立的更新部分(如果我有一个输入而不是 XML):

UPDATE  RC_PermissionsUsers
SET     ntid = @ntid,
        departmentID = @departmentID,
        role = @role
WHERE   ntid = @ntid

插入部分的其余程序(工作):

BEGIN

    SET NOCOUNT ON; 

    BEGIN TRANSACTION;

        BEGIN       
            INSERT INTO RC_PermissionsUsers
            (
                            ntid,
                            departmentID,
                            [role]
            )
            SELECT          ParamValues.ntid.value('.', 'varchar(255)'),
                            @departmentID,
                            @role
            FROM            @xmlUsers.nodes('/users/ntid') AS ParamValues(ntid)
            WHERE NOT EXISTS 
            (
                SELECT      ntid
                FROM        RC_PermissionsUsers
                WHERE       ntid = ParamValues.ntid.value('.', 'varchar(255)')
            )               

        END

    COMMIT TRANSACTION;  
END

【问题讨论】:

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


    【解决方案1】:

    我们可以使用 MERGE,将 XML 值选择到临时表中并使用 MERGE

    BEGIN
    
        SET NOCOUNT ON; 
    
        BEGIN TRANSACTION;
    
            BEGIN    
    
                IF object_id('tempdb.dbo.#tmpList') IS NOT null DROP TABLE #tmpList
                create table #tmpList(
                    id                      varchar(255),
                    departmentID            int,
                    role                    int
                )
    
                insert into #tmpList
                SELECT          ParamValues.ntid.value('.', 'varchar(255)'),
                                @departmentID,
                                @role
                FROM            @xmlUsers.nodes('/users/ntid') AS ParamValues(ntid)
    
                MERGE  RC_PermissionsUsers as PU
                USING ( select id, departmentID, role from #tmpList) T
                        ON PU.ntid = T.id
                WHEN MATCHED THEN 
                    UPDATE SET departmentId = T.departmentID,
                               role = T.role
                WHEN NOT MATCHED THEN
                    INSERT ( ntid, departmentID, role)  
                       VALUES ( T.id, T.departmentID, T.role)           
    
    
            END
    
        COMMIT TRANSACTION;  
    END
    

    【讨论】:

    • 非常感谢 - 这太棒了!只有一个问题:我可以在这里也使用一个临时表,而不是创建一个真正的表并在以后删除它吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 2021-02-09
    相关资源
    最近更新 更多