Как удалить строки с помощью переменной в SQL Server? - PullRequest
0 голосов
/ 25 октября 2018

Надеюсь, что вы можете помочь мне решить эту проблему ниже.

ДЕТАЛИ : я пытаюсь создать хранимую процедуру для своего проекта фабрики данных Azure, где я могу передать имя переменной таблицы черезчтобы сказать SQL Server, чтобы удалить строки.

Все это является частью инструмента ERP с транзакционными данными.Я бы удалил строки, которые находятся в цели, но изменены в источнике.

Пример : rowid 1 - € 100 в целевом объекте, но позже изменяется в источнике до € 80.Затем мне нужно удалить эту строку с целевым значением 100 евро и скопировать новое значение из источника с тем же идентификатором строки в цель.


Я мигрирую из среды Oracle в среду Microsoft.В Oracle у меня есть этот SQL для хранимой процедуры:

create or replace procedure AAAAA_delete
as
cursor c_del
is


select 'delete from ' ||table_name ||' a where not exists (select 1 from ' ||replace(table_name,'AAAAA','BBBBB') ||' b where a.rowid = b.rowid)' deletions
from all_tables
where table_name like 'AAAAA%'
and table_name not like 'AAAAA_LOAD%'
and table_name not in ('AAAAA_TIME','AAAAA_CONFIGURATION')
order by 1;

begin
for r_del in c_del
    loop
     execute immediate r_del.deletions;
     commit;
    end loop;
end;
** имена были изменены на AAAA и BBBB с целью публикации кода **

Мне интересно, как я могу преобразовать это в MS SQL.

ПОЧЕМУ? : весь процесс ETL в фабрике данных Azure основан на переменных.Все имена таблиц и т. Д. Хранятся в таблице метаданных.И это зависит от + - 70 таблиц.

ВОПРОС : можно ли создать общую хранимую процедуру для удаления строк в зависимости от имени, через которое я прохожу.

1 Ответ

0 голосов
/ 25 октября 2018

Да, ваш код может быть адаптирован для MS SQL;

create procedure AAAAA_delete AS
DECLARE @VARA NVARCHAR(100);
DECLARE @EXEC NVARCHAR(1000); 

DECLARE CURSER CURSOR 
  LOCAL STATIC READ_ONLY FORWARD_ONLY
FOR 
    SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES 
    where table_name like 'AAAAA%'
and table_name not like 'AAAAA_LOAD%'
and table_name not in ('AAAAA_TIME','AAAAA_CONFIGURATION')
order by 1

OPEN CURSER
FETCH NEXT FROM CURSER INTO @VARA
WHILE @@FETCH_STATUS = 0
BEGIN 
      SET @EXEC = N'delete from ' +@VARA +' a where not exists (select 1 from ' + replace(@VARA,'AAAAA','BBBBB') +' b where a.rowid = b.rowid)'

      EXEC(@EXEC)

     FETCH NEXT FROM CURSER INTO @VARA
END
CLOSE CURSER
DEALLOCATE CURSER
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...