SQL Server 2012中的变量声明错误

时间:2015-09-15 16:29:33

标签: sql sql-server sql-server-2012

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'附近的语法不正确。

2 个答案:

答案 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的信息