SQL-запрос для удаления данных из таблиц, определенных в таблице
Я пытаюсь удалить данные из нескольких таблиц в моей базе SQL.
В базе данных у меня есть таблица с названием company, которая содержит имена каждой таблицы, из которой мне нужно удалить данные.
давайте предположим, что у меня есть 3 компании в моей таблице компании.
Что я хочу сделать, это удалить все записи в некоторых определенных таблицах в каждой компании.
Итак, в таблице компании у меня есть следующие 3 записи:
1 2 3
В базе данных также есть следующие таблицы, в которых представлены отсканированные документы каждой компании.
dbo.1.documents
dbo.2.documents
dbo.3.documents
Я пытаюсь создать запрос SQL, который будет проходить через таблицу dbo.company, и очистить таблицы документов на основе найденных там названий компаний.
Это мой код:
DECLARE @MyCursor CURSOR;
DECLARE @MyField varchar;
BEGIN
SET @MyCursor = CURSOR FOR
select top 1000 [Name] from dbo.Company
OPEN @MyCursor
FETCH NEXT FROM @MyCursor
INTO @MyField
WHILE @@FETCH_STATUS = 0
BEGIN
delete * from 'dbo.'+@MyField+'$documents'
FETCH NEXT FROM @MyCursor
INTO @MyField
END;
CLOSE @MyCursor ;
DEALLOCATE @MyCursor;
END;
Я не уверен, как должен идти синтаксис, но я предполагаю, что это что-то вроде этого.
Кто-нибудь хочет узнать, как я могу динамически удалять данные, основанные на записях в dbo.company.name?
2 ответа
Используйте динамический sql.
Замените оператор delete на код ниже (объявление может быть сделано в начале):
DECLARE @sql NVARCHAR(1000)
SET @sql = N'delete from dbo.'+CONVERT(VARCHAR,@MyField)+'documents'
EXEC sp_executesql @sql
Вы можете использовать динамический SQL немного по-другому и избежать всех хлопот и накладных расходов при создании курсора для этого. Я использую значения в вашей таблице, чтобы сгенерировать несколько операторов delete и затем выполнить их. Это намного меньше усилий для кодирования и устраняет этот неприятный курсор.
declare @SQL nvarchar(max) = ''
select @SQL = @SQL + 'delete dbo.[' + c.Name + '$documents];'
from dbo.Company
select @SQL --uncomment the line below when you are satisfied the dynamic sql is correct
--exec sp_executesql @sql