Table 使用 sp_executesql 执行动态 sql 时不存在错误

Table doesn't exist error when execuitng dynamic sql with sp_executesql

如果我打开与数据库的连接,例如,使用 SSMS,并且我 运行 查询如下:

SELECT * FROM MySchema.MyTable

查询执行无误。

如果我运行它像这样动态sql

declare var @qry nvarchar(200);
set @qry = N'SELECT * FROM MySchema.MyTable'
exec master.sys.sp_executesql @qry

我收到一条错误消息,指出 table 不存在。

如果我将数据库名称前缀放在 MySchema.MyTable 名称之前,即 MyDb.MySchema.MyTable 查询 运行s 正确。

如何避免在动态中不指定数据库名称的错误SQL?

试试这个!

改变这个

exec master.sys.sp_executesql @qry

exec sp_executesql @qry

exec @qry

使用

 exec @sql 

如果有任何输出参数就足够了,然后使用

 exec sp_executesql 

Recursive 和 koushik veldanda 的两个答案都很好,但这让我们对问题有了更深入的了解:

问题是使用

执行查询
exec master.sys.sp_execute_sql @qry

将上下文更改为 master 数据库,因此 MySchema.MyTable 不可访问,因为它不属于 master,而是属于 MyDb

如果用

执行查询
exec sys.sp_execute_sql @qry

上下文在当前数据库中维护,因此table可以访问,查询运行没有问题。