SQL SERVER修正函數名輕易激發的成績剖析。本站提示廣大學習愛好者:(SQL SERVER修正函數名輕易激發的成績剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是SQL SERVER修正函數名輕易激發的成績剖析正文
1. 成績
明天碰到一個奇異的成績:應用sp_helptext XXX查詢出來的函數界說名居然跟函數名分歧,而sp_helptext現實是查詢sys.all_sql_modules這個體系視圖的。直接查詢這個視圖的definition字段,發明跟sp_helptext是一樣的。豈非是體系視圖也存在緩存之類的機制?或許是個BUG?關於第一個成績,其時情形緊迫,沒有時光去求證能否存在了。第二個成績,我想沒甚麼能夠,SQL SERVER成長到明天(SQL 2016正式版預備推出,我應用的情況則是SQL 2008 R2,打了SP3),曾經是很成熟的一個體系,即便是湧現BUG也不是我這類程度的人能發明的,確定是哪我哪裡弄錯了。因而乞助於數據庫技巧交換群,很快有年夜神答復了是更名的成績。我立時就想起這個函數在一個多禮拜前,由於測試的須要,經由過程SSMS改了原函數名,而SQL SERVER不會由於更名去更新sys.all_sql_modules視圖的definition字段的!因而就形成了曾經編譯好的函數與sys.all_sql_modules體系視圖的函數界說湧現了紛歧致的情形。
2. 看重與剖析成績
做一個測試來重現下成績。起首,新建一個簡略的測試函數dbo.ufn_test_1。
USE AdventureWorks2008R2; GO IF OBJECT_ID(N'dbo.ufn_test_1') IS NOT NULL BEGIN DROP FUNCTION dbo.ufn_test_1; END GO CREATE FUNCTION dbo.ufn_test_1 () RETURNS CHAR(1) AS BEGIN RETURN ('F'); END GO
code-1: 創立函數dbo.ufn_test_1
這時候,應用sp_helptext和sys.all_sql_modules查詢,一切正常。
EXEC sp_helptext [dbo.ufn_test_1]; GO SELECT OBJECT_ID('dbo.ufn_test_1') AS a, * FROM sys.all_sql_modules WHERE [object_id] = OBJECT_ID('dbo.ufn_test_1'); GO
code-2:查詢函數dbo.ufn_test_1的界說
figure-1: 查詢函數dbo.ufn_test_1的界說
在SSMS上直接更名為dbo.ufn_test_2。
figure-2: 修正函數名
再去查詢函數dbo.ufn_test_2的界說。如許,就湧現了曾經編譯好的函數跟在視圖中的函數界說湧現了紛歧致的情形!假如經由過程sp_helptext和sys.all_sql_modules查詢湧現的界說去更重生產辦事器,就確定會湧現成績。
3. 處理與結論
處理辦法也很簡略,把這個函數重建便可。假如應用SSMS的右鍵修正(Modify)或生成相干劇本(Script Function as)的菜單,則不會湧現以上的成績。異樣的成績與處理辦法,也實用於存儲進程。
結論:
(1)盡可能不要修正對象名,確切要修正的話,就重建吧。假如是表而且包括的年夜量數據要重建的話,就比擬費事了,即便是修正表名不會湧現像函數、存儲進程的成績,但修正表名觸及運用法式等成績。
(2)盡可能應用SSMS的右鍵菜單修正或生成對象的界說。但假如函數或存儲進程太多,會認為sp_helptext和sys.all_sql_modules會更便利些,查詢出來的成果要賣力查對下對象名能否分歧便可。這裡提一下,sp_helptext有些限制,可以參考SQL中print、sp_helptext的限制與擴大。