如何在T-SQL中使用数据库名称的variables?

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

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 

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

使用{SERVERNAME}占位符将整个脚本放入模板string中。 然后编辑string使用:

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

然后运行它

 EXECUTE (@SQL_SCRIPT) 

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

你不能EXEC多个批次。 GO是批处理分隔符,而不是T-SQL语句。 有必要build立三个单独的string,然后在EXEC每个replace之后。

我想可以做一些“聪明”的东西,把单个模板string拆分成多行, 我已经在ADO.NET代码中完成了。

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

以下是我刚刚testing过的一些代码(以及哪些代码):

 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模式(在Management Studio的“查询”菜单中启用此模式)。

 :setvar dbname "TEST" CREATE DATABASE $(dbname) GO ALTER DATABASE $(dbname) SET COMPATIBILITY_LEVEL = 90 GO ALTER DATABASE $(dbname) SET RECOVERY SIMPLE GO 

编辑:

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

不幸的是,你不能用这种格式的variables来声明数据库名称。

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

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

然后打电话

 EXECUTE(@Sql) or sp_executesql(@Sql) 

执行sqlstring。

您不能在create table语句中使用variables。 我可以build议的最好的事情是把整个查询写成一个string,然后执行exec。

尝试这样的事情:

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