SET FMTONLY ON的问题

时间:2008-09-16 13:17:50

标签: sql-server

我正在使用SET FMTONLY ON执行存储过程,以模拟我们的代码生成器所做的事情。但是,似乎在执行此类结果时缓存结果,因为我仍然从我刚刚删除的proc中获得转换失败错误!即使我在没有SET FMTONLY ON的情况下执行proc也会发生这种情况。

有谁能告诉我这里发生了什么?

3 个答案:

答案 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)

  1. 这听起来像是客户端错误。在通过SQL Management Studio运行时是否收到相同的消息?

  2. 您是否确认没有其他程序与其他架构/用户拥有的名称相同?

答案 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