我正在测试以特定前缀开头的所有数据库的drop database查询。但是,因为这很容易导致我正在采取我的drop数据库查询的可怕事情
declare @dbname nvarchar (200);
declare @query nvarchar (max);
DECLARE db_cursor CURSOR FOR
select name from sys.databases
where name like 'PREFIX%'
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
并希望将Drop Database
部分更改为不那么可怕的部分。
所以 MAIN QUESTION 是否有一个简单的SQL查询,我可以放在那里,它总是适用于任何SQL Server数据库?所以我知道这个查询只会在切换回Drop Database
之前影响我想要的数据库吗?
编辑:更好的是,一个将返回数据库名称的查询。
与select name from sys.databases
类似,但与['+ @dbname + ']
一起使用只能返回带有该前缀的数据库名称,以确保此查询影响相应的数据库。
答案 0 :(得分:2)
而不是Exec(@query)
,只需致电PRINT @query
即可。这将显示您打算运行的SQL。
答案 1 :(得分:2)
首先,只需执行以下查询,它将告诉您它将在其余代码中提出哪些数据库
select name from sys.databases
where name like 'PREFIX%'
最后添加一个PRINT
语句,以查看在游标内动态构建的最终DROP DATABASE
语句。
您的代码有一些小改进:
declare @dbname SYSNAME;
declare @query nvarchar (max);
DECLARE db_cursor CURSOR LOCAL FORWARD_ONLY FOR
select name from sys.databases
where name like 'PREFIX%'
Open db_cursor
fetch next from db_cursor into @dbname
while (@@FETCH_STATUS = 0)
BEGIN
set @query = 'Drop Database '+ QUOTENAME(@dbname)
--Exec sp_executesql @query --<-- For execution
-- PRINT @query --<-- For debugging
FETCH NEXT FROM db_cursor INTO @dbname
END
Close db_cursor
deallocate db_cursor