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

时间:2009-12-09 15:14:42

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

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

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

我知道这是完全错误的,但我想知道是否有人可以为我发光。

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

5 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

肯定可以通过动态构建选择字符串并执行来完成,但这会很糟糕。

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

答案 3 :(得分:0)

通常,这样一个问题的答案是动态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 :(得分:0)

使用同义词。例如,这会将同义词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]

有了这个,写下您的所有查询以使用同义词而不是真实的表名。同义词具有数据库范围,因此在一个地方管理“目标切换”,可能在存储过程中。