SQL Server如何在存储过程中查找对象名称?

时间:2014-07-11 10:14:21

标签: sql-server stored-procedures database-schema

我在SQL Server 2008中有一个存储过程,例如:

CREATE PROCEDURE [dbo].[test]
AS
BEGIN
    SET NOCOUNT ON;
    SELECT user_name(); 
    SELECT SCHEMA_NAME()
    SELECT * FROM MyView
END

我有一个名为testuser.MyView的视图。然后我使用以下方法调用SP:

exec as user = 'testuser' exec test 

这表示user_name和SCHEMA_NAME都设置为 testuser 但是我也收到Invalid object name 'MyView'.消息,因为SP仍然在dbo架构中查找视图名称。

无论如何都要改变SP的执行方式,以便MyView对象引用testuser.MyView而不必使用完全限定的名称?

我试图在不同模式的相同表结构上使用一组许多存储过程。我真的想避免使用动态SQL重写所有SP,或者使用限定名称创建所有SP的副本。

1 个答案:

答案 0 :(得分:1)

使用模块所有者的默认架构解析非限定对象名称。此行为无法更改,因此您需要使用您提到的其他方法。

由于您已经为具有相同结构的每个用户创建了单独的表和视图,为什么不同时在用户的模式中创建存储过程?