[英]In SQL server 2012,when I create any trigger,it shows error “must declare scalar variable”
[英]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.