2014-09-23 63 views
0

我使用SQL Server 2008,并有一个存储过程,其中一个输入参数的格式为xml。 这个xml是一个名字列表,每个单词没有空格。SQL Server:如何使用Update语句和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 

非常感谢提前,蒂姆。

回答

2

我们可以用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 
+0

非常感谢 - 这是伟大的!只有一个问题:我可以在这里使用临时表吗,而不是创建一个真正的表,然后放下它? – user2571510 2014-09-23 18:33:05