我在我的脚本中的几个地方使用数据库名称,我希望能够快速更改它,所以我正在寻找这样的东西:
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
但它不起作用。那么编写这段代码的正确方法是什么?
答案 0 :(得分:126)
将整个脚本放入模板字符串中,使用{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)
答案 1 :(得分:95)
您也可以使用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工具设置参数。
答案 2 :(得分:10)
不幸的是,您无法使用该格式的变量声明数据库名称。
对于您要完成的任务,您需要将语句包装在EXEC()语句中。所以你有类似的东西:
DECLARE @Sql varchar(max) ='CREATE DATABASE ' + @DBNAME
然后致电
EXECUTE(@Sql) or sp_executesql(@Sql)
执行sql字符串。
答案 3 :(得分:5)
您不能在create table语句中使用变量。我可以建议的最好的事情是将整个查询编写为字符串并执行该操作。
尝试这样的事情:
declare @query varchar(max);
set @query = 'create database TEST...';
exec (@query);