2008-09-16 73 views
1

我正在執行使用SET FMTONLY ON的存儲過程,以便模擬我們的代碼生成器的功能。但是,似乎執行結果被緩存,因爲我仍然得到一個轉換失敗錯誤從我剛剛刪除的過程!即使在沒有SET FMTONLY ON的情況下執行proc也會發生這種情況。SET FMTONLY ON的問題

任何人都可以告訴我這是怎麼回事?

+2

咄!我將FMTONLY設置爲ON,並且我在DDL中所做的任何操作似乎都沒有影響。 – ProfK 2008-09-16 13:24:10

回答

1

有些語句仍然會執行,即使SET FMTONLY ON。您「轉換失敗」錯誤可能來自存儲過程中的set variable語句等簡單操作。例如,這返回的第一個查詢中的元數據,而是拋出一個異常,當它運行的最後一條語句:

SET FMTONLY on 

select 1 as a 

declare @a int 
set @a = 'a' 

至於運行過程下降,這是一個新的給我。 SQL Server使用系統表來確定要執行的對象,因此,是否爲該對象緩存執行計劃並不重要。如果刪除它,它將從系統表中刪除,並且永遠不可執行。您可以在執行該過程之前查詢sysobjects(或sys.objects)嗎?我希望你會發現你沒有放棄它。

0
  1. 這聽起來像是客戶端錯誤。在通過SQL Management Studio運行時是否收到相同的消息?

  2. 您是否確認沒有另一個具有相同名稱的程序擁有其他架構/用戶?

0

解析DDL語句,但如果在連接上執行了SET FMTONLY ON,則會在運行時被忽略。因此,如果在FMTONLY爲ON時放下proc,table等,語句將被解析,但操作不會被執行。

嘗試此驗證

SET FMTONLY OFF 

--create表上

CREATE TABLE TestTable (Column1 INT, Column2 INT) 

--insert 1結果

INSERT INTO TestTable (Column1, Column2) 
VALUES (1,2) 

測試--validate記錄插入

SELECT * FROM TestTable 

--now設置格式只能爲ON

SET FMTONLY ON 
返回

--columns,但沒有數據

SELECT * FROM TestTable 

與FMTONLY --perform DDL語句

DROP TABLE TestTable 

- - 再次將FMTONLY關閉

SET FMTONLY OFF 

--The表上面下降,所以這不應該工作

SELECT * FROM TestTable 

DROP TABLE TestTable 

SELECT * FROM TestTable