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

SQL Server存储过程中的动态数据源

  •  0
  • Dutchie432  · 技术社区  · 16 年前

    我有一个包含多个数据库的SQL Server。我有一个主数据库,它包含几个带有实体和ID号的表。然后,这些实体中的每一个都有一个与其所有信息相关的数据库(不是表,而是数据库)。例如,如果主数据库中的A实体的ID号为1,则在同一SQL Server上会有一个子数据库1数据库。

    我知道这是完全不正确的,但我想知道是否有人能为我照亮这一点。

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE PROCEDURE GetInstallationCount
    -- Add the parameters for the stored procedure here
    @installId int=0
    AS
    BEGIN
      SET NOCOUNT ON;
    
      //Trying to make the DatabaseName dynamic here!!
      select count(*) from dbo.Installation@installId.Names
    
    END
    GO
    

    5 回复  |  直到 16 年前
        1
  •  1
  •   RichardOD    16 年前

    仔细阅读如何 create dynamic SQL 尤其 sp_executesql . 这应该让你开始:

    DECLARE @theSql varchar(1000)
    DECLARE @installId int
    SET @installId = 1
    SET @theSql = 'SELECT COUNT(*) FROM dbo.Installation' + CAST(@installId as nvarchar) + '.Names'
    EXEC  (@theSql)
    
        2
  •  0
  •   cdonner    16 年前

    Here is a good introduction 斯科特·米切尔的这项技术。

        3
  •  0
  •   Maximilian Mayerl    16 年前

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE PROCEDURE GetInstallationCount
    -- Add the parameters for the stored procedure here
    @installId int=0
    AS
    BEGIN
      SET NOCOUNT ON;
      DECLARE @sql nvarchar(MAX)
    
      SET @sql = 'select count(*) from dbo.Installation' + Cast(@installId as nvarchar) + '.Names'
      EXECUTE dbo.sp_executesql @sql
    
    END
    GO
    
        4
  •  0
  •   Andrew    16 年前

    当然,可以通过动态构建select字符串并执行来完成,但这会很麻烦。

        5
  •  0
  •   Damir Sudarevic    16 年前

    使用同义词。例如,这将同义词dbo.MySpecialTable设置为指向数据库DB_3中的表dbo.SomeTable。

    IF object_id(N'SN', N'dbo.MySpecialTable') IS NOT NULL 
            DROP SYNONYM dbo.MySpecialTable
    CREATE SYNONYM dbo.MySpecialTable FOR [DB_3].[dbo].[SomeTable]
    

    有了它,编写所有查询以使用同义词而不是真正的表名。同义词具有DB作用域,因此在一个位置(可能在存储过程中)管理“目标切换”。