如果我打开与数据库的连接,例如,使用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中指定数据库名称的情况下避免错误?
答案 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