如何在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);