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可以访问,查询运行没有问题。
如果我打开与数据库的连接,例如,使用 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可以访问,查询运行没有问题。