如何使用 SQL Server 中的变量删除行?



希望你能帮助我解决下面的问题。

详细信息:我正在尝试为 Azure 数据工厂项目创建一个存储过程,我可以在其中传递变量表名称以告知 SQL Server 删除行。

这一切都是具有交易数据的ERP工具的一部分。我会删除目标中但在源中更改的行。

示例:rowid 1 - 目标中的 €100,但稍后在来源中更改为 €80。然后我需要删除目标中带有 €100 的行,并将新值从具有相同 rowid 的源复制到目标


我正在从 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。

为什么?:Azure 数据工厂中的整个 ETL 过程基于变量。所有表名等都存储在元数据表中。这取决于 +- 70 张桌子。

:是否可以创建一个通用存储过程来根据我传递的名称删除行。

是的,您的代码可以适应 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

最新更新