我正在使用SET FMTONLY ON执行存储过程,以模拟我们的代码生成器所做的事情。但是,似乎在执行此类结果时缓存结果,因为我仍然从我刚刚删除的proc中获得转换失败错误!即使我在没有SET FMTONLY ON的情况下执行proc也会发生这种情况。
有谁能告诉我这里发生了什么?
答案 0 :(得分:1)
即使使用 SET FMTONLY ON
,仍会执行某些陈述。您“转换失败”错误可能来自存储过程中的set variable
语句这么简单。例如,这将返回第一个查询的元数据,但在运行最后一个语句时抛出异常:
SET FMTONLY on
select 1 as a
declare @a int
set @a = 'a'
至于运行一个丢弃的程序,对我来说这是一个新的程序。 SQL Server使用系统表来确定要执行的对象,因此对于该对象是否缓存执行计划并不重要。如果删除它,它将从系统表中删除,并且永远不应该是可执行的。你可以在执行程序之前查询sysobjects(或sys.objects)吗?我希望你会发现你没有放弃它。
答案 1 :(得分:0)
这听起来像是客户端错误。在通过SQL Management Studio运行时是否收到相同的消息?
您是否确认没有其他程序与其他架构/用户拥有的名称相同?
答案 2 :(得分:0)
解析DDL语句,但如果在连接上执行了SET FMTONLY ON,则会在运行时忽略它们。因此,如果在FMTONLY为ON时删除proc,table等,则会解析该语句,但不会执行该操作。
尝试此验证
SET FMTONLY OFF
- 创建要测试的表
CREATE TABLE TestTable (Column1 INT, Column2 INT)
- 插入1条记录
INSERT INTO TestTable (Column1, Column2)
VALUES (1,2)
- 验证记录已插入
SELECT * FROM TestTable
- 现在只将格式设置为ON
SET FMTONLY ON
- 返回列,但没有数据
SELECT * FROM TestTable
- 使用FMTONLY ON执行DDL语句
DROP TABLE TestTable
- 再次关闭FMTONLY
SET FMTONLY OFF
- 上面的表被删除了,所以这不起作用
SELECT * FROM TestTable
DROP TABLE TestTable
SELECT * FROM TestTable