Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从服务器中删除所有数据库_Sql_Sql Server_Sql Server 2005 - Fatal编程技术网

Sql 从服务器中删除所有数据库

Sql 从服务器中删除所有数据库,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我有一台服务器(SQLServer2005),有300多个数据库。我不想逐个右键单击并选择Delete 如何轻松删除所有数据库?您可以通过SSMS GUI执行此操作。选择数据库节点,然后F7以显示对象资源管理器详细信息,选择要删除的所有数据库,点击“删除”,然后选择“关闭现有连接”和“出错后继续”选项 或者,您可以通过TSQL执行以下操作 EXEC sp_MSforeachdb ' IF DB_ID(''?'') > 4 BEGIN EXEC('' ALTER DATABASE [?] S

我有一台服务器(SQLServer2005),有300多个数据库。我不想逐个右键单击并选择
Delete


如何轻松删除所有数据库?

您可以通过SSMS GUI执行此操作。选择
数据库
节点,然后F7以显示对象资源管理器详细信息,选择要删除的所有数据库,点击“删除”,然后选择“关闭现有连接”和“出错后继续”选项

或者,您可以通过TSQL执行以下操作

EXEC sp_MSforeachdb '
IF DB_ID(''?'') > 4
BEGIN
EXEC(''
ALTER DATABASE [?] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DROP DATABASE [?]
'')
END'

下面是我对同样问题的解决方案:

-- drops all user databases
DECLARE @command nvarchar(max)
SET @command = ''

SELECT  @command = @command
+ 'ALTER DATABASE [' + [name] + ']  SET single_user with rollback immediate;'+CHAR(13)+CHAR(10)
+ 'DROP DATABASE [' + [name] +'];'+CHAR(13)+CHAR(10)
FROM  [master].[sys].[databases] 
 where [name] not in ( 'master', 'model', 'msdb', 'tempdb');

SELECT @command
EXECUTE sp_executesql @command

我使用了Pellared提供的答案,并对其进行了轻微修改

-- drops all user databases
DECLARE @command nvarchar(max)
SET @command = ''

SELECT  @command = @command
+ 'ALTER DATABASE [' + [name] + ']  SET single_user with rollback immediate;'+CHAR(13)+CHAR(10)
+ 'DROP DATABASE [' + [name] +'];'+CHAR(13)+CHAR(10)
FROM  [master].[sys].[databases] 
where [name] like 'DBName%';

-- PRINT @COMMAND
EXECUTE sp_executesql @command

这是我的PowerShell脚本版本。DropAllDatabases.ps1

$sqlCmdPath="C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn\sqlcmd.exe"
& $sqlCmdPath -S localhost -Q "EXEC sp_MSforeachdb 'IF DB_ID(''?'') > 4 BEGIN PRINT ''?'' ALTER DATABASE [?] SET SINGLE_USER WITH ROLLBACK IMMEDIATE DROP DATABASE [?] END'"

注意:您可能需要将$sqlCmdPath更新到您的SQL版本。

而MartinSmith的答案是正确的解决方案。我发现在删除许多数据库中的第一个数据库时,“删除对象”窗口的状态为“正在处理”。这是因为msdb备份历史记录过多,正在尝试清除该历史记录,并选中“删除数据库的备份和还原历史记录信息”选项

有关清理备份历史记录的更多信息,请参阅这些链接


添加提供的索引后,删除操作在合理的时间内完成。

我的数据库遇到了问题,上面的解决方案不起作用

我只是想删除我所有的数据库,但它们的名称有问题。事实上,我的数据库命名如下:

093e83d-somename;
39s2ak3-anothername;
删除这些数据库(在MariaDB上测试)的更简单方法是执行以下命令:

DROP DATABASE `093e83d-somename`;
当我们直接想要从bash文件执行SQL命令时,这种名称似乎是个问题,因为我们必须在反引号(``)之间指定数据库的名称

如果您有相同的问题,并且有很多数据库,那么您只需要创建一个包含所有所需命令的批处理脚本,然后在SQL server中执行这个脚本

带有test.sh的示例:

#!/bin/bash

# Informations needed
MUSER="root"
MPASS="pass"

# We get the needed binaries
MYSQL=$(which mysql)
AWK=$(which awk)
GREP=$(which grep)

# We get all the DB names in DB
DB=$($MYSQL -u $MUSER -p$MPASS -e 'show databases' | $AWK '{ print $1}' | $GREP -v '^Databases' )

# For each database, we write the drop command in the file test.sql
for t in $DB
do
    echo -e "DROP DATABASE \`$t\`;" >> test.sql
done

# We execute the created SQL file with all the DROP commands
$MYSQL -u $MUSER -p$MPASS -e 'source test.sql;'

# We finally delete the created file.
rm test.sql

我认为这个脚本在所有情况下都有效。希望这有所帮助。

这将终止所有连接,并删除列表中未列出的所有数据库:

('master'、'tempdb'、'model'、'msdb'、'ReportServer' ,'ReportServerTempDB')



您可以像这样使用游标:

DECLARE @DBName VARCHAR (64)
DECLARE @SQL VARCHAR (255)

DECLARE DROPDB CURSOR FOR 
SELECT name FROM sys.databases
WHERE name NOT IN ('master','model','msdb','tempdb','distribution','ReportServer','ReportServerTempDB')

OPEN DROPDB
FETCH next FROM DROPDB INTO @DBName
WHILE @@FETCH_STATUS = 0

BEGIN
    SET @SQL = 'DROP DATABASE ' + @DBName
    PRINT @SQL
    EXEC @SQL
    FETCH next FROM DROPDB INTO @DBName
END

CLOSE DROPDB
DEALLOCATE DROPDB
在我的博客里,更多的是关于这个话题。

使用T-SQL删除(删除)MS-SQL中所有数据库的安全方法是排除所有系统数据库和您要保留的任何其他数据库,以及特殊数据库,如数据仓库数据库“DW”,报表服务器数据库

排除所有我们想保留的数据库,包括所有系统数据库,这样就可以安全地删除我们不想保留的所有其他数据库

例如:

use master
go
declare @dbnames nvarchar(max)
declare @statement nvarchar(max)
set @dbnames = ''
set @statement = ''
select @dbnames = @dbnames + ',[' + name + ']' from sys.databases 
    where name 
    NOT IN ('master','model','msdb','tempdb') 
    AND name NOT LIKE '%AdventureWorks%' -- Database to keep 
    AND name NOT LIKE '%DW%' -- Data warehouse database
    AND name NOT LIKE '%ReportServer%' -- Report server database
if len(@dbnames) = 0
    begin
    print 'no databases to drop'
    end
else
    begin
    set @statement = 'drop database ' + substring(@dbnames, 2, len(@dbnames))
    print @statement
    exec sp_executesql @statement
    end
go

我想不出有哪一种情况会有人需要删除服务器上的所有用户数据库。我个人从未见过这种情况。你能描述一下你为什么要这样做吗?我有一个学院,所有的学生都有一个DB!所以…来晚了,但我需要不时在本地开发设备上做这件事你的意思是你需要安排时间来做这件事吗?sp_MSforeachdb会忽略已经处于
单用户模式的数据库。在这种情况下,用户可以使用UI,也可以通过从@pellared建议的
[master].[sys].[databases]
中选择来构造一条语句,因为它试图删除系统数据库,并且deadlocked@charlierlee什么系统数据库?数据库id谓词将排除master、tempdb、model和msdb。与复制相关的一个?出于某种原因,这实际上起了作用:@charlierlee谢谢。最终在这里做了相应的改变
use master
go
declare @dbnames nvarchar(max)
declare @statement nvarchar(max)
set @dbnames = ''
set @statement = ''
select @dbnames = @dbnames + ',[' + name + ']' from sys.databases 
    where name 
    NOT IN ('master','model','msdb','tempdb') 
    AND name NOT LIKE '%AdventureWorks%' -- Database to keep 
    AND name NOT LIKE '%DW%' -- Data warehouse database
    AND name NOT LIKE '%ReportServer%' -- Report server database
if len(@dbnames) = 0
    begin
    print 'no databases to drop'
    end
else
    begin
    set @statement = 'drop database ' + substring(@dbnames, 2, len(@dbnames))
    print @statement
    exec sp_executesql @statement
    end
go