Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách cập nhật bảng dựa trên tham số XML

Sử dụng cte đệ quy cho phép tôi có được kết quả mà bạn đang tìm kiếm. Như sau đây cho thấy. Nhưng ít nhất nó không phải là con trỏ / vòng lặp while;)

declare @tmpConstraint table (ID int , Constraint_Value varchar(256))
insert into @tmpConstraint values 
(1, '(OldVal_1) (OldVal_2)'),
(2, '(OldVal_2) (OldVal_1)')

declare @myXML XML
set @myXML = N'<qaUpdates>
    <qaUpdate><old>OldVal_1</old><new>NewVal_1</new></qaUpdate>
    <qaUpdate><old>OldVal_2</old><new>NewVal_2</new></qaUpdate>
</qaUpdates>'

declare @xmlData table (oldValue varchar(256), newValue varchar(256))
insert into @xmlData 
select 
    oldValue = Child.value('(old)[1]', 'varchar(50)'), 
    newValue = Child.value('(new)[1]', 'varchar(50)')
from @myXML.nodes('/qaUpdates/qaUpdate') as N(Child) 

Phần trên chỉ được thiết lập cho phần sau.

;with cte (ID, Constraint_Value, CLevel)
as
(
    select c.ID, c.Constraint_Value, 1
    from @tmpConstraint c

    union all

    select p.ID, cast(replace(p.Constraint_Value, x.oldValue, x.newValue) as varchar(256)), p.CLevel + 1
    from cte p
    join @xmlData x on p.Constraint_Value like '%' + x.oldValue + '%'
)
update c
set c.Constraint_Value = t.Constraint_Value
from @tmpConstraint c
join (
    select 
        *,
        rn = row_number() over (partition by ID order by CLevel desc)
    from cte
) t on t.ID = c.ID and rn = 1

select * from @tmpConstraint


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách gửi nhiều lệnh tới SQL Server 2008 với một chuyến khứ hồi

  2. Chỉ mục nằm ngoài giới hạn của Mảng. (Microsoft.SqlServer.smo)

  3. Chạy SERVERPROPERTY () với một máy chủ được liên kết trong SQL Server

  4. Chúng tôi có thể xóa tệp vật lý khỏi máy chủ khi tôi xóa mục nhập tương ứng khỏi cơ sở dữ liệu không?

  5. Cách đổi tên cơ sở dữ liệu SQL Server bằng T-SQL