образец таблицы:
create table yourtable (id int,property varchar(5))
Процедура для этой таблицы:
create procedure p_test
(
@id int,
@prolist varchar(2000)
) as
begin
;with x as
(
SELECT * FROM yourtable WHERE id = @ID
)
MERGE INTO
x t1
using
(SELECT @id id, ltrim(t.c.value('.', 'VARCHAR(2000)')) property
FROM (
SELECT x = CAST('<t>' +
REPLACE(@prolist, ',', '</t><t>') + '</t>' AS XML)
) a
CROSS APPLY x.nodes('/t') t(c)) t2 on t1.id = t2.id and t1.property = t2.property
when not matched then INSERT (id,property)
VALUES(t2.id, t2.property)
when matched
THEN UPDATE SET t1.id = t2.id
WHEN NOT MATCHED BY SOURCE THEN DELETE
;
end
Тестирование:
exec p_test 3, 'b,c'
select * from yourtable
exec p_test 3, 'a,b,c'
select * from yourtable
exec p_test 3, 'a,c'
select * from yourtable
exec p_test 4, 'g,h'
select * from yourtable
Результат:
id property
3 b
3 c
id property
3 b
3 c
3 a
id property
3 c
3 a
id property
4 g
3 c
3 a
4 h
EDIT:
для того, чтобы обновить новую использовать колонку в этой таблице:
create table yourtable (id int,property varchar(5), is_active bit default 1)
Используйте эту процедуру:
alter procedure p_test
(
@id int,
@prolist varchar(2000)
) as
begin
;with x as
(
SELECT * FROM yourtable WHERE id = @ID
)
MERGE INTO
x t1
using
(SELECT @id id, ltrim(t.c.value('.', 'VARCHAR(2000)')) property
FROM (
SELECT x = CAST('<t>' +
REPLACE(@prolist, ',', '</t><t>') + '</t>' AS XML)
) a
CROSS APPLY x.nodes('/t') t(c)) t2 on t1.id = t2.id and t1.property = t2.property
when not matched then INSERT (id,property, is_active)
VALUES(t2.id, t2.property, 1)
when matched
THEN UPDATE SET t1.id = t2.id, is_active = 1
WHEN NOT MATCHED BY SOURCE THEN
UPDATE SET t1.is_active = 0
;
end
издание не является правильным. Это изменило первоначальную идею. Должно быть {3, 'a, b, c'} – Ventura
Это означает, что мой id равен 3, а свойство - {a, b, c}. три записи таблицы для каждой позиции свойства. – zooney
Я попытался решить вышеупомянутую проблему, сначала удалив совпадающие строки, а затем вставив новые строки. Я искал эффективный подход к его решению. И ответ t -clausen.dk с помощью «слияния» вполне уместен для моей проблемы. Вернемся к моей проблеме, так как она просвещает подход слияния в sql. – zooney