[英]Delete all tables by cursor(fetch table names) in SQL Server
我有一个stg_table
列的元数据表。 这是dbo
架构中STAGE
数据库表的名称。 如果insert_type列为'select',我希望在游标存在的情况下删除表。
元数据示例: https : //imgur.com/a/TfyIWpv
我的游标代码:
declare kursor cursor for
select *
from METADATA.dbo.META_SOURCESTAGE;
declare @insert_type varchar(15),
@stg_table varchar(30),
@src varchar(80),
@SQL varchar(254);
open kursor
fetch next from kursor into @insert_type, @stg_table, @src;
while @@FETCH_STATUS = 0
begin
if @insert_type = 'select'
begin
select @SQL = 'IF OBJECT_ID('+@stg_table+') IS NOT NULL DROP TABLE '+@stg_table
exec(@SQL)
fetch next from kursor into @insert_type, @stg_table, @src;
end
if @insert_type = 'bulk'
execute ('truncate table ' + @stg_table);
print @stg_table;
fetch next from kursor into @insert_type, @stg_table, @src;
end
close kursor;
deallocate kursor;
我想通过在METADATA表创建的游标从STAGE.dbo。*中删除所有现有表。
我收到一个错误:
Msg 4104,Level 16,State 1,Line 2
无法绑定多部分标识符“STAGE.dbo.STG_KLIENT”。 STAGE.dbo.STG_MELDUNEKMsg 4104,Level 16,State 1,Line 2
无法绑定多部分标识符“STAGE.dbo.STG_MIEJSCOWOSC”。
STAGE.dbo.STG_PRACOWNIK
@EDIT更改了代码 - 添加了开始/结束但仍然出现相同的错误。
它抱怨无法绑定OBJECT_ID
调用,您的代码会产生如下结果:
IF OBJECT_ID(STAGE.dbo.STG_KLIENT) IS NOT NULL DROP TABLE STAGE.dbo.STG_KLIENT
DROP TABLE
部分很好,但是你需要在调用OBJECT_ID
引用表名,因为它需要一个(N)VARCHAR
输入,所以请使用:
select @sql = 'IF OBJECT_ID('''+@stg_table+''') IS NOT NULL DROP TABLE '+@stg_table
-- ^^ ^^
此外,您的代码有点遍布。 它会跳过一些表,因为你正在做的是:
这是一个稍微改进的版本:
while @@FETCH_STATUS = 0
begin
if @insert_type = 'select'
begin
select @sql = 'IF OBJECT_ID('''+@stg_table+''') IS NOT NULL DROP TABLE '+@stg_table
end
else if @insert_type = 'insert'
begin
select @sql = 'TRUNCATE TABLE ' + @stg_table
end
print @sql -- "debugging"
-- only do those once if you can, so you don't get lost in how the code branches
exec sp_executesql @sql
fetch next from kursor into @insert_type, @stg_table, @src;
end
此外,你真的不需要光标。 您只需生成一个大查询并执行一次即可。
DECLARE @sql NVARCHAR(MAX) = ''
SELECT @sql += CONCAT(CASE
WHEN meta.insert_table = 'select'
AND OBJECT_ID(meta.stg_table) IS NOT NULL
THEN CONCAT('DROP TABLE ', meta.stg_table)
WHEN meta.insert_table = 'insert'
THEN CONCAT('TRUNCATE TABLE', meta.stg_table)
END,
';', CHAR(13), CHAR(10)) -- add newline for easier reading
FROM METADATA.dbo.META_SOURCESTAGE meta
PRINT @sql
EXEC sp_executesql @sql
这应该工作,虽然我没有测试过,但我希望你能得到这个想法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.