繁体   English   中英

SQL Server 2012中的变量声明错误

[英]Variable declare error in 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,第15级,状态1,第7行
“ @dbname”附近的语法不正确。

消息319,第15级,州1,第7行
关键字“ with”附近的语法不正确。 如果此语句是公用表表达式,xmlnamespaces子句或更改跟踪上下文子句,则前一条语句必须以分号终止。

Msg 102,第15级,状态1,第7行
“立即”附近的语法不正确。

您的问题不在于声明,而是这里的用法

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

请先在开发或测试实例上尝试遵循以下脚本,然后再在高效的实例上使用它

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命令,以便您可以看到要执行的操作。

您可以在给定的示例教程中找到有关如何使用sp_executesql运行动态sql的信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM