SET FMTONLY ON的问题

时间:2020-03-05 18:55:53  来源:igfitidea点击:

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

谁能告诉我这是怎么回事?

解决方案

回答

  • 这听起来像是客户端错误。通过SQL Management Studio运行时,是否会收到相同的消息?
  • 我们是否已确认不存在其他模式/用户拥有的同名过程?

回答

即使在" SET FMTONLY ON"下,某些语句仍将被执行。"转换失败"错误可能来自存储过程中的" set variable"语句之类的简单事件。例如,这返回第一个查询的元数据,但是在运行最后一条语句时抛出异常:

SET FMTONLY on

select 1 as a

declare @a int
set @a = 'a'

至于运行删除的过程,对我来说这是一个新的过程。 SQL Server使用系统表来确定要执行的对象,因此,是否为该对象缓存了执行计划都没有关系。如果删除它,将从系统表中删除它,并且永远不要执行。我们可以在执行该过程之前查询sysobjects(或者sys.objects)吗?我希望我们会发现我们尚未删除它。

回答

将解析DDL语句,但如果在连接上执行了SET FMTONLY ON,则运行时将忽略DDL语句。因此,如果在FMTONLY为ON时删除proc,表等,则会分析该语句,但不会执行该动作。

试试这个验证

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