Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Cara memperbarui tabel berdasarkan parameter XML

Memanfaatkan cte rekursif memungkinkan saya mendapatkan hasil yang Anda cari. Seperti yang ditunjukkan berikut ini. Tapi setidaknya itu bukan kursor/perulangan sementara;)

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) 

Di atas baru saja disiapkan untuk yang berikut.

;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. sql server membagi nilai yang dipisahkan koma menjadi kolom

  2. Bagaimana cara mengembalikan dua kolom dari tabel pertama jika hanya satu kolom yang cocok sebagian dengan yang kedua?

  3. Fungsi Lead() dan LAG() di SQL Server 2008

  4. Indeks berkerumun dan Urutan berdasarkan Klausa

  5. Men-debug prosedur tersimpan di SQL Server Management Studio