【问题标题】:Variable declare error in SQL Server 2012SQL Server 2012 中的变量声明错误
【发布时间】:2015-12-12 00:16:05
【问题描述】:
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

但我得到错误

消息 102,第 15 级,状态 1,第 7 行
'@dbname' 附近的语法不正确。

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

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

【问题讨论】:

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


【解决方案1】:

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

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

【讨论】:

  • 如果出于安全原因连接添加QUOTENAME(@dbname),以防万一:)
【解决方案2】:

请先在开发或测试实例上尝试以下脚本,然后再将其用于生产实例

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多