sql-server - 使用同义词跨数据库共享存储过程

标签 sql-server stored-procedures code-reuse

我有两个不同的 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 的本地副本,但未找到。

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

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

最佳答案

像这样的东西适用于过程的定义。请务必防范 SQL 注入(inject),因为这是动态构建的。

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'

关于sql-server - 使用同义词跨数据库共享存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11617832/

相关文章:

sql-server - SSRS : filter parameter passed to sub-report

mysql - 需要在Access中查看表1中的数据,其中ID与表2中的ID匹配

Mysql PREPARE 语句在记录插入时花费了很多时间

Hibernate 用于存储过程访问

c# - 如何在异常处理中使用接口(interface)

asp.net session 状态模式 "SQLServer"

sql - 检查表是否存在,如果不存在,则在SQL Server 2008中创建它

sql-server - 如果表设计发生变化,确定存储过程中的错误

android - 如何删除不同应用程序相同 Activity 中的代码重复?

asp.net-mvc - Visual Studio : What approach do you use to 'template' plumbing for similar projects?