代码之家  ›  专栏  ›  技术社区  ›  Srikar Doddi

在SQL Server存储过程中动态设置数据库名称?

  •  4
  • Srikar Doddi  · 技术社区  · 15 年前

    如何在SQL Server存储过程中动态设置数据库名称?

    3 回复  |  直到 11 年前
        1
  •  10
  •   Raj More    15 年前

    存储过程是特定于数据库的。如果您想动态地访问另一个数据库中的数据,您必须创建动态SQL并执行它。

    Declare @strSQL VarChar (MAX)
    Declare @DatabaseNameParameter VarChar (100) = 'MyOtherDB'
    
    SET @strSQL = 'SELECT * FROM ' + @DatabaseNameParameter + '.Schema.TableName'
    

    可以使用if子句设置 @DatabaseNameParameter 到你喜欢的程度。

    执行语句以获取结果。

        2
  •  15
  •   momo    11 年前

    有时,使用同义词是一种很好的策略:

    CREATE SYNONYM [schema.]name FOR [[[linkedserver.]database.]schema.]name
    

    然后,通过存储过程中的同义词引用该对象。

    更改同义词点的位置是动态SQL的问题,但是您的主要存储过程可以完全不使用动态SQL。创建一个表来管理需要引用的所有对象,以及一个将所有所需同义词切换到正确上下文的存储过程。

    此功能仅在SQL Server 2005及更高版本中可用。

    此方法不适用于频繁切换或不同连接需要使用不同数据库的情况。我将它用于偶尔在服务器之间移动的数据库(它可以在prod数据库或复制数据库中运行,并且它们具有不同的名称)。将数据库恢复到新的主目录后,我在它上运行switcheroo-sp,大约8秒钟后一切正常。

        3
  •  3
  •   gbn    15 年前

    这是 动态SQL并适用于存储过程

    Declare @ThreePartName varchar (1000)
    Declare @DatabaseNameParameter varchar (100)
    
    SET @DatabaseNameParameter = 'MyOtherDB'
    
    SET @ThreePartName = @DatabaseNameParameter + '.Schema.MyOtherSP'
    
    EXEC @ThreePartName @p1, @p2...   --Look! No brackets