在 SQL Server 2008 中调用系统存储过程时使用正确的数据库

Pet*_*din 6 sql-server stored-procedures information-schema

我认为在运行自定义系统存储过程时,在使用哪个数据库时,我缺少一些东西。我的存储过程中有以下内容(为简洁起见进行了编辑):

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
Run Code Online (Sandbox Code Playgroud)

问题是当我从 mydb 调用该过程时,主表用于初始检查,而不是当前数据库。如果我编写 mydb.INFORMATION_SCHEMA.TABLES 它可以工作,但这并不是真正的解决方案,因为它破坏了将其作为单个 SP 而不是每个 DB 一个 SP 的全部意义。

有任何想法吗?我尝试将 DB 名称作为参数传递并使用“use @db_name”启动 SP,但显然存储过程不允许使用语句。

在此先感谢所有帮助。

Mar*_*ith 5

您需要将您的存储过程标记为系统对象以获得您想要的行为(下面的完整示例在 2008 SP3 上测试)

USE master;
GO

CREATE PROCEDURE dbo.sp_mysp
AS
SELECT *
FROM INFORMATION_SCHEMA.TABLES

GO

USE tempdb;
EXEC dbo.sp_mysp /*Returns tables from master*/

GO

USE master;
EXEC sys.sp_MS_marksystemobject sp_mysp

GO

USE tempdb;
EXEC dbo.sp_mysp /*Returns tables from tempdb*/
Run Code Online (Sandbox Code Playgroud)

这是一种未记录的方法,可能在未来版本中不起作用。