Мне нужно удалить записи на основе столбца идентификатора. Мы реализовали ссылочную целостность в базе данных с использованием внешних ключей. Иерархия была идентифицирована, и порядок удаления всех данных дочерней таблицы до того, как данные родительской таблицы указаны в таблице внешнего ключа, выглядит следующим образом:
id tablename
10 childtable1
9 childtable2
8 childtable3
7 childtable4
6 childtable5
5 childtable6
4 childtable7
3 childtable8
2 childtable9
1 childtable10
0 parenttable
Запрос на удаление данных выглядит следующим образом:
BEGIN TRANSACTION
DECLARE @i INT
SET @i=0
WHILE @@ROWCOUNT > 0
DELETE TOP (100000) FROM mytable
WHERE NOT EXISTS
(SELECT 1 FROM dbo.myIDtable
WHERE myIDtable.ID = mytable.ID
AND myIDtable.ID IN (1,2)
)
SET @i=@i+1
COMMIT;
Проблема в том, что мне нужно передать имя таблицы в оператор удаления на основе значения столбца ID таблицы внешнего ключа, указанной выше.
Как мне это сделать?
Мы используем базу данных Azure SQL, которая не позволяет выполнять кросс-запросы к базе данных без создания внешних таблиц для каждой задействованной таблицы. У нас более 150 таблиц, так что это не вариант.
BEGIN TRANSACTION
DECLARE @i INT
SET @i=0
WHILE @@ROWCOUNT > 0
DELETE TOP (100000) FROM mytable
WHERE NOT EXISTS
(SELECT 1 FROM dbo.myIDtable
WHERE myIDtable.ID = mytable.ID
AND myIDtable.ID IN (1,2)
) AND mytable = (select case id
when 10 then RTRIM(LTRIM(SUBSTRING(TABLENAME, 60, 50)))
when 9 then RTRIM(LTRIM(SUBSTRING(TABLENAME, 55, 50)))
when 8 then RTRIM(LTRIM(SUBSTRING(TABLENAME, 49, 50)))
when 7 then RTRIM(LTRIM(SUBSTRING(TABLENAME, 43, 50)))
when 6 then RTRIM(LTRIM(SUBSTRING(TABLENAME, 37, 50))) when 5 then RTRIM(LTRIM(SUBSTRING(TABLENAME, 31, 50)))
when 4 then RTRIM(LTRIM(SUBSTRING(TABLENAME, 25, 50)))
when 3 then RTRIM(LTRIM(SUBSTRING(TABLENAME, 19, 50)))
when 2 then RTRIM(LTRIM(SUBSTRING(TABLENAME, 13, 50)))
when 1 then RTRIM(LTRIM(SUBSTRING(TABLENAME, 7, 50)))
else tablename
end
from dbo.foreignkeytable)
SET @i=@i+1
COMMIT;