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