【问题标题】:Dynamic Datasource in SQL Server Stored ProcudureSQL Server 存储过程中的动态数据源
【发布时间】:2009-12-09 23:47:11
【问题描述】:

我有一个包含多个数据库的 SQL Server。我有一个主数据库,其中包含多个带有实体和 ID 号的表。然后,这些实体中的每一个都有一个关联数据库(不是表,而是数据库)及其所有信息。例如,如果 MAIN 数据库中的实体的 ID 号为 1,则同一 SQL Server 上将有一个 SubDatabase1 数据库。

基本上,我要做的是在 MAIN 数据库中创建一个存储过程,该过程从 SUB 数据库中收集数据,但我从中收集的 SUB 数据库应根据传递给 Proc 的 ID 号确定。

我知道这完全不正确,但我想知道是否有人可以为我阐明这一点。

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

谢谢 - J

【问题讨论】:

    标签: sql sql-server stored-procedures dynamic datasource


    【解决方案1】:

    阅读如何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)
    

    【讨论】:

    • 好的,我想是这样的,但我一生都想不通谢谢
    • 哦,原来是installationXXXXX.dbo.Names,dbo.installationXXXXX.Names。所有这些不同的编程语言并不能一下子融入我的大脑。
    【解决方案2】:

    您必须使用动态 SQL 来执行此操作。无法在运行时以任何其他方式解析表名和数据库名。

    Here is a good introduction Scott Mitchell 的这项技术。

    【讨论】:

      【解决方案3】:

      通常,此类问题的答案是动态 SQL:

      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】:

        绝对可以通过动态构建选择字符串并执行来完成,但它会很讨厌。

        您可能会变得非常浮华并尝试创建苍蝇的同义词,在查询中使用它们然后删除它们,但我不确定这是否值得。

        【讨论】:

          【解决方案5】:

          使用同义词。例如,这会将同义词 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 范围,因此可以在一个地方管理“目标切换”,可能在存储过程中。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-04-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多