0

我正在测试以特定前缀开头的所有数据库的删除数据库查询。但是,因为这很容易导致可怕的事情,所以我正在使用 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部分更改为不那么可怕的东西。

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

编辑:更好的是,将返回数据库名称的查询。就像select name from sys.databases一个['+ @dbname + ']只返回具有该前缀的数据库的名称以确保此查询影响适当的数据库的方法。

4

2 回答 2

2

而不是Exec(@query),只需调用PRINT @query. 这将向您显示您打算运行的 SQL。

打印文档

于 2015-09-28T20:40:11.487 回答
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
于 2015-09-28T20:41:55.810 回答