2014-11-21 49 views
0

我有,我已经纳入一个批处理文件,应通过另一个进程将重新创建并再次填充数据库运行之前自动删除数据库的查询。我用这个查询巴吉查询删除数据库

declare @dbname nvarchar (2000); 
declare @query nvarchar (max); 

DECLARE db_cursor CURSOR FOR 
select name from sys.databases 
where name like '%ABCDir%' 

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 

问题是它没有删除所有东西。来自每次运行的结果将填充另一个表,当我运行后续运行时,我将获得当前运行中先前运行的结果。 Anyboyd查看如何设置此查询的错误?

+0

尝试添加一些'BEGIN TRY .. BEGIN CATCH..'代码来捕获和报告任何错误。 – RBarryYoung 2014-11-21 17:12:26

+0

不是问题,但: EXEC sp_executesql的@query http://technet.microsoft.com/en-us/library/ms175170(v=sql.105).aspx – 2014-11-21 17:21:02

+0

这是否查询返回从SYS任何结果'选择名称。数据库的名字像'%ABCDir%'? – 2014-11-21 17:26:45

回答

0

该脚本将确保您连接到数据库,然后更改数据库模式为单用户,这意味着只有一个用户可以连接到数据库,然后将连接到主数据库就会留下数据库被丢弃没有连接,最后你可以删除数据库。

还可以使用适当的数据类型,你的数据库绝不会2000个字符那么为什么要使用一个变量,VARCHAR 2000年,使用特定的存储SQL Server的对象名SYSNAME数据类型。

使用QUOTENAME()函数把方括号你的数据库名称。使您的代码看起来更干净,并保护您免受可能的SQL注入攻击。

declare @dbname SYSNAME; 
declare @query NVARCHAR(max); 

DECLARE db_cursor CURSOR FOR 
select name from sys.databases 
where name like '%ABCDir%' 

Open db_cursor 
fetch next from db_cursor into @dbname 

WHILE (@@FETCH_STATUS = 0) 
BEGIN 
    SET @query = N' USE ' + QUOTENAME(@dbname) 
       + N' ALTER DATABASE ' + QUOTENAME(@dbname) 
       + N' SET SINGLE_USER WITH ROLLBACK IMMEDIATE; ' 
       + N' USE master;' 
       + N' Drop Database ' + QUOTENAME(@dbname) + '' 

    EXEC sp_executesql @query 

    FETCH NEXT FROM db_cursor INTO @dbname 

END 

Close db_cursor 
deallocate db_cursor