0

特定のプレフィックスで始まるすべてのデータベースに対してドロップ データベース クエリをテストしています。ただし、それは恐ろしいことに簡単につながる可能性があるため、ドロップデータベースクエリを使用しています

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 Server データベースにも常に適用できる単純な SQL クエリをそこに入れることはできますか? したがって、このクエリは、元に戻す前に、必要なデータベースにのみ影響することを知っています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 に答える