将应用于每个SQL Server数据库的查询

时间:2015-09-28 20:32:31

标签: sql sql-server database drop-database

我正在测试以特定前缀开头的所有数据库的drop database查询。但是,因为这很容易导致我正在采取我的drop数据库查询的可怕事情

declare @dbname nvarchar (200);
declare @query nvarchar (max);

DECLARE db_cursor CURSOR FOR  
select name from sys.databases 
where name like 'PREFIX%' 

Open db_cursor
fetch next from db_cursor into @dbname

while @@FETCH_STATUS = 0

BEGIN
  set @query = 'Drop Database ['+ @dbname + ']' 
  Exec(@query)

  FETCH NEXT FROM db_cursor INTO @dbname 

END
Close db_cursor
deallocate db_cursor

并希望将Drop Database部分更改为不那么可怕的部分。

所以 MAIN QUESTION 是否有一个简单的SQL查询,我可以放在那里,它总是适用于任何SQL Server数据库?所以我知道这个查询只会在切换回Drop Database之前影响我想要的数据库吗?

编辑:更好的是,一个将返回数据库名称的查询。 与select name from sys.databases类似,但与['+ @dbname + ']一起使用只能返回带有该前缀的数据库名称,以确保此查询影响相应的数据库。

2 个答案:

答案 0 :(得分:2)

而不是Exec(@query),只需致电PRINT @query即可。这将显示您打算运行的SQL。

PRINT Documentation

答案 1 :(得分:2)

首先,只需执行以下查询,它将告诉您它将在其余代码中提出哪些数据库

select name from sys.databases 
where name like 'PREFIX%' 

最后添加一个PRINT语句,以查看在游标内动态构建的最终DROP DATABASE语句。

您的代码有一些小改进:

declare @dbname  SYSNAME;
declare @query nvarchar (max);

DECLARE db_cursor CURSOR LOCAL FORWARD_ONLY FOR  
select name from sys.databases 
where name like 'PREFIX%' 

Open db_cursor
fetch next from db_cursor into @dbname

while (@@FETCH_STATUS = 0)
BEGIN

  set @query = 'Drop Database '+ QUOTENAME(@dbname)  

   --Exec sp_executesql @query       --<-- For execution
   -- PRINT @query                   --<-- For debugging
  FETCH NEXT FROM db_cursor INTO @dbname 

END
Close db_cursor

deallocate db_cursor