3

我有两个不同的 SQL Server 数据库(在同一台服务器上——如果有帮助的话),它们需要共享相同的存储过程逻辑。我试图实现的解决方案如下所示:

Database1
  Table: TestTable
  Synonym: sp_MyProc pointing at SharedDatabase.dbo.sp_MyProc

Database2
  Table: TestTable
  Synonym: sp_MyProc pointing at SharedDatabase.dbo.sp_MyProc

SharedDatabase
  Proc: sp_MyProc which runs queries against TestTable

我希望使用同义词,这样如果我在 Database1 的上下文中执行 sp_MyProc,它将使用 Database2.TestTable。如果我在 Database2 的上下文中执行 sp_MyProc,它将违反 Database2.TestTable。但是,当我通过任一同义词执行 sp_MyProc 时,它会忽略同义词的上下文并执行查找未找到的 TestTable 的本地副本。

有没有办法通过同义词或其他机制实现对不同数据库中表的不同副本执行的共享存储过程?

编辑
我应该提到,在我的情况下,我希望使用大量现有表和过程来执行此操作,因此任何需要修改过程或表本身的解决方案都不理想。

4

2 回答 2

3

像这样的东西适用于过程的定义。一定要防止 SQL 注入,因为它是动态构建的。

CREATE PROCEDURE [dbo].dosomething 
  @databaseName sysname,
  @schema sysname,
  @tableName sysname
  as
  declare @cmd as nvarchar(max)
  set @cmd = N'select * from ' + quotename(@schema) + N'.' + quotename(@tableName)
  exec sp_executesql @cmd

然后像这样使用它:

  dosomething 'SampleDb', 'dbo', 'sampleTable'
于 2012-07-23T18:08:06.310 回答
1

如果存储过程在 SharedDatabase 中,那么它将始终在 SharedDatabase 的上下文中运行。为了完成您试图集中代码的操作,我可能会传入一个参数来指定它来自哪个服务器,这样您就可以针对该特定的 TestTable 执行查询。基本上,您需要使用它们的完全限定名称来引用每个表 - 即 Database1.dbo.TestTable



  USE SharedDatabase

  CREATE PROCEDURE [dbo].sp_MyProc 
  @dbsource varchar(50)
  as 

  if(@dbsource == 'DB1')
  begin

    select * from Database1.dbo.TestTable

  end
  else
  begin

    select * from Database2.dbo.TestTable

  end


  GO 




另一种选择是在 SharedDatabase 中创建一个视图,该视图将被称为 TestTableComposite,并带有一个额外的列来标识源数据的位置。然后将其作为参数传入,SharedDatabase 上的 SP 将始终位于该数据库的上下文中。

于 2012-07-23T18:17:22.153 回答