[推荐] (SqlServer)分离所有用户数据库
——通过知识共享树立个人品牌。
在实际应用中,有时我们需要一次性分离所有用户数据库,下面给出代码,供大家参考。
USE
[
master
]
GO
IF EXISTS( SELECT *
FROMsys.objects
WHERE [ object_id ] = OBJECT_ID(N ' [dbo].[spDetachAllUserDatabases] ')
ANDtype IN(N ' P ',N ' PC '))
DROP PROCEDURE [ dbo ]. [ spDetachAllUserDatabases ]
GO
CREATE PROCEDURE [ dbo ]. [ spDetachAllUserDatabases ]
AS
BEGIN
-- DeclareVariables
DECLARE @DatabaseName VARCHAR( 100)
DECLARE @MinDatabaseID INT
DECLARE @MaxDatabaseID INT
DECLARE @SQL VARCHAR( 4000)
-- Checkfortemporarytableanddropitifitexists
IF OBJECT_ID( ' tempDB.dbo.#Database ') IS NOT NULL
DROP TABLE [ #Database ];
-- Createtemporarytable
CREATE TABLE# Database
(
ID INT IDENTITY( 1, 1),
DatabaseName VARCHAR( 100)
)
-- Checkforexistinguserdatabases
IF EXISTS( SELECTname
FROMsys.databases
WHEREdatabase_id > 4
ANDname NOT IN( ' SQLDBA ', ' ReportServer ',
' ReportServerTempDB ',
' distribution '))
BEGIN
-- Insertalldatabasenamesintoatemporarytable
INSERT INTO# Database(DatabaseName)
SELECTname
FROMsys.databases
WHEREdatabase_id > 4
ANDname NOT IN( ' SQLDBA ', ' ReportServer ',
' ReportServerTempDB ',
' distribution ')
-- SetVariablesforthedetachdatabaseloop
SELECT @MinDatabaseID = MIN(ID),
@MaxDatabaseID = MAX(ID)
FROM# Database
-- Beginlooptodetachdatabases
WHILE @MinDatabaseID <= @MaxDatabaseID
BEGIN
-- GetDatabaseName
SELECT @DatabaseName =DatabaseName
FROM# Database
WHEREID = @MinDatabaseID
-- BuildDetachDatabaseCommand
SET @SQL = ' EXECsp_detach_db ' + '''' + @DatabaseName
+ '''' + ' ; '
-- TryCatchblocktoexecuteSQLandhandleerrors
BEGINTRY
-- DetachDatabase
EXEC( @SQL
)
PRINT ' Detached ' + @DatabaseName
ENDTRY
BEGINCATCH
SELECT @DatabaseName,
message_id,
severity,
[ text ],
@SQL
FROMsys.messages
WHEREmessage_id = @@ERROR
ANDlanguage_id = 1033 -- BritishEnglish
ENDCATCH
-- GetthenextDatabaseNameID
SET @MinDatabaseID = @MinDatabaseID + 1
-- EndLoop
END
END
END
GO
GO
IF EXISTS( SELECT *
FROMsys.objects
WHERE [ object_id ] = OBJECT_ID(N ' [dbo].[spDetachAllUserDatabases] ')
ANDtype IN(N ' P ',N ' PC '))
DROP PROCEDURE [ dbo ]. [ spDetachAllUserDatabases ]
GO
CREATE PROCEDURE [ dbo ]. [ spDetachAllUserDatabases ]
AS
BEGIN
-- DeclareVariables
DECLARE @DatabaseName VARCHAR( 100)
DECLARE @MinDatabaseID INT
DECLARE @MaxDatabaseID INT
DECLARE @SQL VARCHAR( 4000)
-- Checkfortemporarytableanddropitifitexists
IF OBJECT_ID( ' tempDB.dbo.#Database ') IS NOT NULL
DROP TABLE [ #Database ];
-- Createtemporarytable
CREATE TABLE# Database
(
ID INT IDENTITY( 1, 1),
DatabaseName VARCHAR( 100)
)
-- Checkforexistinguserdatabases
IF EXISTS( SELECTname
FROMsys.databases
WHEREdatabase_id > 4
ANDname NOT IN( ' SQLDBA ', ' ReportServer ',
' ReportServerTempDB ',
' distribution '))
BEGIN
-- Insertalldatabasenamesintoatemporarytable
INSERT INTO# Database(DatabaseName)
SELECTname
FROMsys.databases
WHEREdatabase_id > 4
ANDname NOT IN( ' SQLDBA ', ' ReportServer ',
' ReportServerTempDB ',
' distribution ')
-- SetVariablesforthedetachdatabaseloop
SELECT @MinDatabaseID = MIN(ID),
@MaxDatabaseID = MAX(ID)
FROM# Database
-- Beginlooptodetachdatabases
WHILE @MinDatabaseID <= @MaxDatabaseID
BEGIN
-- GetDatabaseName
SELECT @DatabaseName =DatabaseName
FROM# Database
WHEREID = @MinDatabaseID
-- BuildDetachDatabaseCommand
SET @SQL = ' EXECsp_detach_db ' + '''' + @DatabaseName
+ '''' + ' ; '
-- TryCatchblocktoexecuteSQLandhandleerrors
BEGINTRY
-- DetachDatabase
EXEC( @SQL
)
PRINT ' Detached ' + @DatabaseName
ENDTRY
BEGINCATCH
SELECT @DatabaseName,
message_id,
severity,
[ text ],
@SQL
FROMsys.messages
WHEREmessage_id = @@ERROR
ANDlanguage_id = 1033 -- BritishEnglish
ENDCATCH
-- GetthenextDatabaseNameID
SET @MinDatabaseID = @MinDatabaseID + 1
-- EndLoop
END
END
END
GO
© 2011 EricHu
原创作品,转贴请注明作者和出处,留此信息。
------------------------------------------------
cnBlobs:http://www.cnblogs.com/huyong/
优快云:http://blog.youkuaiyun.com/chinahuyong
作者:EricHu(DB、C\S、B\S、WebService、WCF、PM等)
出处:http://www.cnblogs.com/huyong/
Q Q:80368704 E-Mail: 80368704@qq.com
本博文欢迎大家浏览和转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,在『参考』的文章中,我会表明参考的文章来源,尊重他人版权。若您发现我侵犯了您的版权,请及时与我联系。
更多文章请看[置顶]索引贴——(不断更新中)