Получить имя таблицы из другой таблицы с помощью оператора CASE - PullRequest
0 голосов
/ 22 июня 2019

Мне нужно удалить записи на основе столбца идентификатора. Мы реализовали ссылочную целостность в базе данных с использованием внешних ключей. Иерархия была идентифицирована, и порядок удаления всех данных дочерней таблицы до того, как данные родительской таблицы указаны в таблице внешнего ключа, выглядит следующим образом:

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;
...