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,但显然存储过程不允许使用语句。
在此先感谢所有帮助。
您需要将您的存储过程标记为系统对象以获得您想要的行为(下面的完整示例在 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)
这是一种未记录的方法,可能在未来版本中不起作用。
| 归档时间: |
|
| 查看次数: |
6349 次 |
| 最近记录: |