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
Другие вопросы по тегам