遍历值并将每个值传递给SQL Server过程中的查询的最佳方法

时间:2019-10-18 20:44:32

标签: sql sql-server

我有一个select查询,它返回表名列表。我想将每个表名传递给drop table查询,以便删除该表。我可以使用临时表。这是最好的方法吗?还有其他办法吗?

3 个答案:

答案 0 :(得分:0)

答案 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