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

Eri*_*sse 121 sql-server

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

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
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*ers 133

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

SET @SQL_SCRIPT = REPLACE(@TEMPLATE, '{SERVERNAME}', @DBNAME)
Run Code Online (Sandbox Code Playgroud)

然后运行它

EXECUTE (@SQL_SCRIPT)
Run Code Online (Sandbox Code Playgroud)

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

你不能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)
Run Code Online (Sandbox Code Playgroud)

  • `SYSNAME`是一个比`VARCHAR(255)更合适的数据类型``也应该使用`QUOTENAME`来处理所有可能的数据库名称(并且可能根据名称来源防止SQL注入) (4认同)
  • +1非常好的方法......你刚从大量的工作中救了我,但是......虽然它应该是EXECUTE(@SQL_SCRIPT),或者至少那对我有用. (2认同)
  • 但是,逃避时需要小心. (2认同)

Mar*_*ith 101

您也可以使用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
Run Code Online (Sandbox Code Playgroud)

编辑:

查看此MSDN文章,通过SQLCMD工具设置参数.

  • @syclee TSQL 变量?在将脚本发送到服务器之前,不会执行 sqlcmd 替换。 (2认同)

Dil*_*e-O 10

遗憾的是,您无法使用该格式的变量声明数据库名称.

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

DECLARE @Sql varchar(max) ='CREATE DATABASE ' + @DBNAME
Run Code Online (Sandbox Code Playgroud)

然后打电话

EXECUTE(@Sql) or sp_executesql(@Sql)
Run Code Online (Sandbox Code Playgroud)

执行sql字符串.

  • 其实我需要道歉.结果是`EXEC`和`EXECUTE`是一样的.在用'EXEC`失败并用'EXECUTE`成功后,我做了声明.虽然显然我的真正问题与两者无关. (2认同)
  • 不要在生产中这样做......永远. (2认同)

And*_*are 5

您不能在create table语句中使用变量.我可以建议的最好的事情是将整个查询编写为字符串并执行该操作.

尝试这样的事情:

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

exec (@query);
Run Code Online (Sandbox Code Playgroud)