我有一个select
查询,它返回表名列表。我想将每个表名传递给drop table
查询,以便删除该表。我可以使用临时表。这是最好的方法吗?还有其他办法吗?
答案 0 :(得分:0)
您可以编写SQL脚本来使用查询来打开游标并遍历所有值。
查看这些资源:
https://docs.microsoft.com/en-us/sql/t-sql/language-elements/declare-cursor-transact-sql http://www.sqlservertutorial.net/sql-server-stored-procedures/sql-server-cursor/
答案 1 :(得分:0)
有点危险,请确保您使用USE指定数据库。 或将SYS.tables中的select替换为查询以返回表名称。
USE [ENTERDATEBASENAME]
IF OBJECT_ID('tempdb..#TEMP_DROP') IS NOT NULL DROP TABLE #TEMP_DROP;
SELECT * INTO #TEMP_DROP FROM SYS.tables
WHILE EXISTS(SELECT TOP 1 * FROM #TEMP_DROP)
BEGIN
DECLARE @TABLEBNAME VARCHAR(MAX),@SQL VARCHAR(MAX)
SET @TABLEBNAME = (SELECT TOP 1 [NAME] FROM #TEMP_DROP)
SET @SQL = 'DROP TABLE ' + @TABLEBNAME
EXEC(@SQL)
DELETE FROM #TEMP_DROP where [name] = @TABLEBNAME
END
答案 2 :(得分:0)
我不会为此使用循环。与一些简单的动态sql相比,在此处使用游标编写的代码要多得多,而且无论如何您都需要使用动态sql。但是请记住,如果您有外键,则删除一堆表可能会出现问题。您要么需要删除这些外键,要么按特定顺序删除表。
declare @SQL nvarchar(max) = ''
select @SQL = @SQL + 'drop table ' + quotename(TableName) + ';'
from YourQueryThatGivesYouTableNames
exec sp_executesql @SQL