面临"默认架构不存在"的错误.使用exec()在sp内执行运行时查询时

Hot*_*ter 9 sql sql-server sql-server-2005

我已经在sp内部进行了运行时查询,并使用exec()在sp中进行了查询,但在创建sp时我得到了错误

The default schema does not exist.
Run Code Online (Sandbox Code Playgroud)

SP是:

CREATE PROCEDURE MySP
    @tableName varchar(100)

AS
BEGIN   
    SET NOCOUNT ON;

declare @selectQuery varchar(MAX)

set @selectQuery = 'select * from ' + @tableName

exec(@selectQuery)

end
Run Code Online (Sandbox Code Playgroud)

善意的帮助

Mar*_*ith 16

使用 CREATE PROCEDURE dbo.MySP

您登录的用户必须具有不存在的默认架构.

DEFAULT_SCHEMA可以设置为数据库中当前不存在的模式.

此外,您应该使用quotename(@tableName)和参数类型sysname而不是varchar(100)避免SQL注入或只是非标准对象名称的错误.

  • 是.请参阅[动态SQL的诅咒和祝福 - 处理动态表和列名称](http://www.sommarskog.se/dynamic_sql.html#objectnames) (2认同)

RaS*_*Sor 7

您可以更改默认架构:

ALTER USER [YOURDOMAIN\HotTester] WITH DEFAULT_SCHEMA=[dbo]
GO
Run Code Online (Sandbox Code Playgroud)

然后避免包括[dbo].在CREATE PROCEDURE中


cod*_*ger 5

这可能是因为与创建 SP 的用户关联的默认架构不再存在,或者用户不再有权访问该架构。

虽然,我认为 SQL Server 默认使用该dbo架构。也许尝试限定存储过程的模式。

例如

Create Procedure dbo.MySP