我曾经在master中用sp_
前缀创建数据库无关的存储过程,并引用dbo.sysobjects,它们在运行时会绑定到我碰巧遇到的任何数据库。
最终我尝试迁移我的代码以使用更新,更友好的sys.tables,然而,它绑定到编译存储过程的数据库,从而返回错误的数据。
示例:
use master
go
create proc sp_test
as
select name
from sys.tables
go
use MyOtherDb
go
exec sp_test
go
将在master
中产生MyOtherDb
中的表的列表 - 因此在编写这些内容时,我有义务将我的代码包装在一个字符串中并动态执行,这一点尤其困难一旦我已经是编写代码的一两层代码。
任何人都有解决这个问题的方法吗?我敢肯定,我不是那里唯一一个对此嗤之以鼻的人!
答案 0 :(得分:0)
啊!我需要将其标记为系统对象:
exec sp_MS_marksystemobject 'sp_test'