SQL Server存储过程是在安装它们的数据库还是从其运行的数据库上运行?

时间:2018-10-16 21:03:46

标签: sql-server tsql

示例:我编写了一个存储过程,例如dbo.GetAllColumns,它从INFORMATION_SCHEMA.COLUMNS中选择了所有不同的列名。我将其安装在数据库DevOps中。

然后,我从另一个数据库DevOps.dbo.GetAllColumns运行TestProc。输出是TestProc中的所有列还是DevOps中的所有列?

1 个答案:

答案 0 :(得分:2)

在您遇到问题的情况下,它将从DevOps上下文中返回值。

有一种方法可以实现您想要的,但是我不建议这样做。最好只将proc安装到需要它的所有数据库上。

与您期望的行为类似的方法是在master中创建它,给它添加一个sp_前缀,然后(⚠️未记录/不支持)将其标记为系统对象。

USE master

GO

CREATE PROC dbo.sp_GetAllColumns
AS
    SELECT *
    FROM   INFORMATION_SCHEMA.COLUMNS

GO

EXEC sys.sp_MS_marksystemobject
  'dbo.sp_GetAllColumns' 

现在,当从任何其他数据库(使用EXEC dbo.sp_GetAllColumns进行调用时,它将在该上下文中运行。