如何使用变量的数据库名称在 T-SQL?

我在脚本中的几个地方使用了数据库名称,我希望能够快速地更改它,所以我正在寻找类似下面这样的东西:

DECLARE @DBNAME VARCHAR(50)
SET @DBNAME = 'TEST'


CREATE DATABASE @DBNAME
GO
ALTER DATABASE @DBNAME SET COMPATIBILITY_LEVEL = 90
GO
ALTER DATABASE @DBNAME SET RECOVERY SIMPLE
GO

但是它不工作。那么正确的方法是什么来写这个代码?

233945 次浏览

不能在 create 表语句中使用变量。我能建议的最好方法是将整个查询编写为字符串并执行。

试试这样:

declare @query varchar(max);
set @query = 'create database TEST...';


exec (@query);

遗憾的是,不能使用这种格式的变量声明数据库名称。

对于您要完成的任务,您需要将语句包装在 EXEC ()语句中。所以你会有这样的东西:

DECLARE @Sql varchar(max) ='CREATE DATABASE ' + @DBNAME

那就打电话

EXECUTE(@Sql) or sp_executesql(@Sql)

执行 sql 字符串。

使用{ SERVERNAME }占位符将整个脚本放入模板字符串中。然后使用以下方法编辑字符串:

SET @SQL_SCRIPT = REPLACE(@TEMPLATE, '{SERVERNAME}', @DBNAME)

然后运行它

EXECUTE (@SQL_SCRIPT)

很难相信,在三年的时间里,竟然没有人注意到我的代码 没用

你不能 EXEC多批。GO是批分隔符,而不是 T-SQL 语句。有必要构建三个单独的字符串,然后在替换之后分别构建 EXEC

我认为人们可以通过在 GO上分割将单个模板字符串分割成多行来做一些“聪明”的事情; 我已经在 ADO.NET 代码中做过了。

我是从哪里得到“ SERVERNAME”这个词的?

下面是我刚刚测试过的一些代码(它们可以工作) :

DECLARE @DBNAME VARCHAR(255)
SET @DBNAME = 'TestDB'


DECLARE @CREATE_TEMPLATE VARCHAR(MAX)
DECLARE @COMPAT_TEMPLATE VARCHAR(MAX)
DECLARE @RECOVERY_TEMPLATE VARCHAR(MAX)


SET @CREATE_TEMPLATE = 'CREATE DATABASE {DBNAME}'
SET @COMPAT_TEMPLATE='ALTER DATABASE {DBNAME} SET COMPATIBILITY_LEVEL = 90'
SET @RECOVERY_TEMPLATE='ALTER DATABASE {DBNAME} SET RECOVERY SIMPLE'


DECLARE @SQL_SCRIPT VARCHAR(MAX)


SET @SQL_SCRIPT = REPLACE(@CREATE_TEMPLATE, '{DBNAME}', @DBNAME)
EXECUTE (@SQL_SCRIPT)


SET @SQL_SCRIPT = REPLACE(@COMPAT_TEMPLATE, '{DBNAME}', @DBNAME)
EXECUTE (@SQL_SCRIPT)


SET @SQL_SCRIPT = REPLACE(@RECOVERY_TEMPLATE, '{DBNAME}', @DBNAME)
EXECUTE (@SQL_SCRIPT)

也可以使用 sqlcmd模式(在 ManagementStudio 的“ Query”菜单中启用该模式)。

:setvar dbname "TEST"


CREATE DATABASE $(dbname)
GO
ALTER DATABASE $(dbname) SET COMPATIBILITY_LEVEL = 90
GO
ALTER DATABASE $(dbname) SET RECOVERY SIMPLE
GO

编辑:

检查这篇 MSDN文章,通过 SQLCMD 工具设置参数。