use master
Declare @CID integer = 1114
Declare @dbname varchar(50)
set @dbname = (select DatabaseName from [Clients].[dbo].[Client] where clientid = @CID)
select @dbname
alter database @dbname
set single_user with rollback immediate
drop database @dbname
delete from [Clients].[dbo].[client] where clientid = @CID
但我收到错误
Msg 102,Level 15,State 1,Line 7
附近的语法不正确
' @dbname'。Msg 319,Level 15,State 1,Line 7
关键字'与'附近的语法不正确。如果此语句是公用表表达式,xmlnamespaces子句或更改跟踪上下文子句,则必须以分号结束前一个语句。Msg 102,Level 15,State 1,Line 7
' immediate'附近的语法不正确。
答案 0 :(得分:2)
您的问题不在于声明,而是在此处使用
alter database @dbname set single_user with rollback immediate
在某些地方你可以在sql语句中使用变量,通常在where子句中,但是在使用它们的地方有一些限制。
你可以选择这样的东西
use master
Declare @CID integer = 1114
Declare @dbname nvarchar(50)
set @dbname = (select DatabaseName from [Clients].[dbo].[Client] where clientid=@CID)
select @dbname
declare @sql nvarchar (2000) = N'alter database '+ @dbname + N' set single_user with rollback immediate'
exec sp_executeSql @sql
select @sql = N'drop database ' + @dbname
exec sp_executeSql @sql
delete from [Clients].[dbo].[client] where clientid=@CID
答案 1 :(得分:1)
请先在开发或测试实例上尝试使用以下脚本,然后再将其用于高效的
use master
Declare @CID integer = 1114
Declare @dbname varchar(50)
set @dbname = (select DatabaseName from [Clients].[dbo].[Client] where clientid=@CID)
--select @dbname
declare @sql nvarchar(max)
set @sql = 'use ' + @dbname + '
alter database ' + @dbname + ' set single_user with rollback immediate
use master
drop database ' + @dbname
print @sql
-- exec sp_executesql @sql
delete from [Clients].[dbo].[client] where clientid=@CID
请注意,在删除数据库之前,我使用" USE master"
切换到master数据库删除数据库取消注释" exec sp_executesql @sql"声明 我使用了PRINT命令,这样你就可以看到你将要执行的内容。
您可以在给定教程中找到有关如何run dynamic sql using sp_executesql的信息