代码之家  ›  专栏  ›  技术社区  ›  Haoest

如何将数据库名称作为SP中的变量?

  •  0
  • Haoest  · 技术社区  · 14 年前

    我们只在这里使用存储过程,这带来了一个小问题。我们交叉引用了两个不同的数据库,如dev中的dbdev..table1、qa中的dbqa..table1和生产中的dbprod..table1。

    因此,每次部署到不同的环境时,我们都必须从dbdev搜索并替换为dbqa或dbprod。

    有没有使用同义词或其他SQL Server机制来解决问题的方法?

    5 回复  |  直到 14 年前
        1
  •  3
  •   Remus Rusanu    14 年前

    使用sqlcmd变量,该变量由.sql配置脚本的sqlcmd部署以及vsdb项目支持。因此,设置脚本如下所示:

    create procedure usp_myProc
    as
    select .. from [$(crossdb)]..table1;
    go
    

    在生产环境中部署时,运行 sqlcmd /E /I provisoning.sql /v crossdb=dbprod ,而QA部署将通过 sqlcmd /E /I provisioning.sql /v crossdb=dbqa . 见 Using sqlcmd with Scripting Variables .

    作为补充说明,我正在开发一个允许从.NET sqlclient使用sqlcmd变量的项目(sqlconnection,sqlcommand):该 dbutilsqlcmd 项目。

        2
  •  2
  •   devio    14 年前

    SQL Server 2005支持同义词,因此您可以创建同义词1以引用dev环境中的dbdev..table1,以及prod环境中的dbprod..table1。您的SP(可能还有视图)只对同义词进行操作。

    更新:

    这个 最容易的 创建同义词的方法:

    exec sys.sp_MSforeachtable 
        'print ''CREATE SYNONYM '' + REPLACE(''?'', ''].['', ''].[syn_'') + 
        '' FOR [my_database].?
        GO'''
    

    (行前有一个换行符)

    运行并将结果粘贴到新的查询窗口中。

        3
  •  1
  •   Martin Smith    14 年前

    不。

    无法创建数据库的同义词。那是一个 popular request 不过。

    是否确实需要重命名数据库 dbdev , dbqa , dbprod 但是呢?

        4
  •  1
  •   Jeremy    14 年前

    动态SQL

    (请原谅潜在的打字错误,但概念确实存在)

    Declare @dbname nvarchar(255), @sql nvarchar(max)
    set @dbname = 'db1'
    
    Set @sql = 'Select * From ' + @dbname + '.dbo.table1'
    exec sp_executesql @sql
    
        5
  •  0
  •   user235859    14 年前

    可以将数据库名称作为存储过程的参数,然后使用动态SQL来构造查询。

    前任:

    CREATE PROC MyStoredProcedure @DBName VARCHAR(50) 
    AS
    
       DECLARE @SQL VARCHAR(MAX)
       SET @SQL = 'SELECT * FROM ' + @DBName + '.dbo.table1'
       EXEC sp_executesql @SQL
    

    然后,只需使用适当的数据库名称调用存储过程:

    EXEC MyStoredProcedure 'dbdev'