我认为在运行自定义系统存储过程时使用哪个数据库时我缺少一些东西。我的存储过程中有以下内容(为简洁起见进行了编辑):
ALTER PROCEDURE sp_mysp
AS
IF (EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'mytable'))
BEGIN
--Do stuff to the table
END
ELSE
BEGIN
PRINT 'Table mytable does not exist'
END
问题是当我从 mydb 调用过程时,主表用于初始检查,而不是当前数据库。如果我编写 mydb.INFORMATION_SCHEMA.TABLES 它可以工作,但这并不是真正的解决方案,因为它破坏了将其维护为单个 SP 而不是每个 DB 一个 SP 的全部意义。
有任何想法吗?我尝试将 DB 名称作为参数传递并使用“use @db_name”启动 SP,但显然存储过程不允许使用语句。
提前感谢所有帮助。
您需要将存储过程标记为系统对象以获得您想要的行为(下面的完整示例测试为在 2008 SP3 上工作)
这是一种未记录的方法,可能在未来的版本中不起作用。
替代方案:使用动态 SQL。不,在受控的管理功能中,动态 SQL 并不是它通常被认为是邪恶的东西。
现在您可以从任何其他数据库调用:
或者简单地说:
您甚至可以在模型(和所有现有数据库)中创建同义词,如下所示:
(现在您可以取消上述调用的前缀。)
虽然您的通话要复杂一步,但这种方法的好处是: