SqlServer分离所有用户数据库

在实际应用中,有时我们需要一次性分离所有用户数据库,下面给出代码,供大家参考。

USE [ master ]
GO
IF EXISTS ( SELECT *
FROM sys.objects
WHERE [ object_id ] = OBJECT_ID(N ' [dbo].[spDetachAllUserDatabases] ')
AND type IN ( N ' P ', N ' PC ' ) )
DROP PROCEDURE [ dbo ]. [ spDetachAllUserDatabases ]
GO

CREATE PROCEDURE [ dbo ]. [ spDetachAllUserDatabases ]
AS
BEGIN
     -- Declare Variables
     DECLARE @DatabaseName VARCHAR( 100)
     DECLARE @MinDatabaseID INT
     DECLARE @MaxDatabaseID INT
     DECLARE @SQL VARCHAR( 4000)
     -- Check for temporary table and drop it if it exists
     IF OBJECT_ID( ' tempDB.dbo.#Database ') IS NOT NULL
     DROP TABLE [ #Database ];

     -- Create temporary table
     CREATE TABLE # Database
     (
     ID INT IDENTITY( 1, 1),
     DatabaseName VARCHAR( 100)
     )
    
     -- Check for existing user databases
     IF EXISTS ( SELECT name
     FROM sys.databases
     WHERE database_id > 4
     AND name NOT IN ( ' SQLDBA ', ' ReportServer ',
     ' ReportServerTempDB ',
     ' distribution ' ) )
     BEGIN
         -- Insert all database names into a temporary table
         INSERT INTO # Database ( DatabaseName )
         SELECT name
         FROM sys.databases
         WHERE database_id > 4
         AND name NOT IN ( ' SQLDBA ', ' ReportServer ',
         ' ReportServerTempDB ',
         ' distribution ' )
        
         -- Set Variables for the detach database loop
         SELECT @MinDatabaseID = MIN(ID),
         @MaxDatabaseID = MAX(ID)
         FROM # Database
       
         -- Begin loop to detach databases
         WHILE @MinDatabaseID <= @MaxDatabaseID
         BEGIN
        
         -- Get DatabaseName
         SELECT @DatabaseName = DatabaseName
         FROM # Database
         WHERE ID = @MinDatabaseID
        
         -- Build Detach Database Command
         SET @SQL = ' EXEC sp_detach_db ' + '''' + @DatabaseName
         + '''' + ' ; '

         -- Try Catch block to execute SQL and handle errors  
         BEGIN TRY

         -- Detach Database
         EXEC ( @SQL
         )
         PRINT ' Detached ' + @DatabaseName
         END TRY
         BEGIN CATCH
         SELECT @DatabaseName,
         message_id,
         severity,
         [ text ],
         @SQL
         FROM sys.messages
         WHERE message_id = @@ERROR
         AND language_id = 1033 -- British English
         END CATCH

         -- Get the next DatabaseName ID
         SET @MinDatabaseID = @MinDatabaseID + 1
        
         -- End Loop
         END
     END
END

GO

© 2011 EricHu

原创作品,转贴请注明作者和出处,留此信息。

------------------------------------------------

cnBlobs:http://www.cnblogs.com/huyong/
CSDNhttp://blog.csdn.net/chinahuyong

作者:EricHuDBC\SB\SWebServiceWCFPM等)
出处:http://www.cnblogs.com/huyong/

Q Q80368704   E-Mail: [email protected]
本博文欢迎大家浏览和转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,在『参考』的文章中,我会表明参考的文章来源,尊重他人版权。若您发现我侵犯了您的版权,请及时与我联系。
更多文章请看 [置顶]索引贴——(不断更新中)

你可能感兴趣的:(webservice,object,table,database,sqlserver,variables)