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

时间:2015-01-13 10:25:56

标签: sql sql-server tsql

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

SELECT * FROM MySchema.MyTable

执行查询时没有错误。

如果我像这样运行动态sql

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

我收到一条错误,指出该表不存在。

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

如何在没有在dyanmic SQL中指定数据库名称的情况下避免错误?

3 个答案:

答案 0 :(得分:3)

试试这个!

更改此

exec master.sys.sp_executesql @qry

exec sp_executesql @qry

exec @qry

答案 1 :(得分:1)

Recursive和koushik veldanda的答案都很好,但这可以更深入地了解问题:

问题是用

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

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

如果使用

执行查询
exec sys.sp_execute_sql @qry

上下文在当前数据库中维护,因此该表是可访问的,并且查询运行没有问题。

答案 2 :(得分:0)

使用

 exec @sql 
如果有任何输出参数,那么

就足够了

 exec sp_executesql