我有一个包含多个数据库的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
答案 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]
有了这个,写下您的所有查询以使用同义词而不是真实的表名。同义词具有数据库范围,因此在一个地方管理“目标切换”,可能在存储过程中。