参数化数据库名称

时间:2015-07-29 22:37:36

标签: sql-server tsql

我有跨多个环境(DEV,SIT,UAT等)部署的脚本,每个环境中都有不同的数据库名称,即foobar1,foobar2等。

有没有办法在USE [database]中对db名称进行参数化,以避免每个环境有1个脚本?以下代码在@dbname

处失败
DECLARE @dbname NVARCHAR(10)

SET @dbname = (SELECT NAME 
               FROM sys.databases                   
               WHERE NAME LIKE 'foobar%')

USE @dbname

GO

1 个答案:

答案 0 :(得分:0)

就像评论中提到的那样,你有几个选择。

  1. 使用SQLCMD模式。在SQL Management Studio中,您可以在菜单[查询] - >中找到这个(当您打开查询时)。 [SQLCMD模式]。 然后在您的脚本中,您可以使用:

    :SETVAR DatabaseName “AdventureWorks2012″
    USE $(DatabaseName);
    
  2. 有关详细信息,请参阅http://blog.sqlauthority.com/2013/06/28/sql-server-how-to-set-variable-and-use-variable-in-sqlcmd-mode/

    1. 使用占位符。例如。您使用##DATABASENAME##,然后找到/替换为正确的名称。

      USE [##DATABASENAME##];
      
    2. 不要使用USE语句,并在要执行脚本时选择正确的数据库。

    3. 使用动态SQL(这里有点过分)。您的查询将成为一个巨大的字符串,您可以在其中使用变量。

      declare @databasename nvarchar(100) = 'YourDatabaseName';
      declare @sqlStringToExecute nvarchar(max);
      
      set @sqlStringToExecute = 'Use ' + @databasename + '; -- do rest of the query'
      
      EXECUTE sp_executesql @sqlStringToExecute