0

ここで、私がここで試みているのは、任意の条件 (IF ブロック内) に基づいて、SQL Server からデータベースを削除することです。データベースが存在する場合は、削除して再作成します。

私は次のコードを使用しています:

IF EXISTS (SELECT 1 FROM sys.databases db with(nolock) WHERE db.name = 'practice')
BEGIN
    USE master
    DROP DATABASE practice
END

このコードは数分間実行を続けた後、次のようなエラーで応答します

メッセージ 3702、レベル 16、状態 4、行 1
データベース「練習」は現在使用中のため削除できません。

次に、別の試みとして、コード内で GO ステートメントを使用して、次のコードで実行フローを分離しました (これには create database ステートメントも含まれていることに注意してください)。

IF EXISTS (SELECT 1 FROM sys.databases db with(nolock) WHERE db.name = 'practice')
BEGIN
    USE master
    GO

    DROP DATABASE practice
    GO

    CREATE DATABASE practice
END

今、それはこのエラーをスローします:

メッセージ 102、レベル 15、状態 1、行 3
「マスター」付近の構文が正しくありません。
メッセージ 3702、レベル 16、状態 4、行 1
データベース「練習」は現在使用中のため削除できません。
メッセージ 102、レベル 15、状態 1、行 2
'END' 付近の構文が正しくありません

何か不足しているのか、それとも回避策が必要なのかわかりません。

また、もしあれば、この目的に役立つより良い代替品に興味があります.

これが実現可能かどうかはわかりません。

よろしく、シャンクス

4

3 に答える 3

0

練習のために、次のコードを使用できます。

EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N'practice'
GO
USE [master]
GO
ALTER DATABASE [practice] SET  SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
DROP DATABASE [practice]
GO

これで、新しい DB を作成できます。

于 2016-05-05T01:11:53.230 に答える
0

また、行うことができます

sp_who2 

誰が、または何がその DB に接続されているかを確認します。その後、

KILL SPID# (i.e. "KILL 54") 

その接続を強制的に閉じます。これは本番環境では危険ですが、とにかく DB を削除して再作成する場合は...

これは @TheGameiswar が提案するものよりも少し外科的ですが、非常に似ています。

于 2016-05-05T00:40:08.167 に答える