2009-11-15 26 views
2

考慮事件的序列如下:)如何在重新定義依賴對象後刷新T-SQL用戶定義函數的定義?

  1. 視圖v_Foo被定義
  2. 用戶定義的函數的getFoo(被定義,其包括來自v_Foo所有列(使用「選擇* ...」)
  3. 的v_Foo變化的定義,目前包括多個列
  4. 我現在想的getFoo()包括在v_Foo新列,但它仍然引用舊的定義

我可以重新運行創建GetFoo的腳本,並且一切都會很好;但這是有問題的原因,我不會去。有沒有其他方法可以刷新用戶定義函數的定義,以便與其相關對象同步?

+0

注:我知道很多人會通過「選擇* ...」和分心會傾向於讓我煩惱 - 請保住你的呼吸。我有我的理由。 – 2009-11-15 19:36:32

+1

隨着*你會錯過所有的SCHEMABINDING好吃的東西:http://blogs.msdn.com/sqlprogrammability/archive/2006/05/12/596424.aspx – 2009-11-15 19:54:20

回答

4

簡短,簡單的答案是沒有

你必須重新定義表格UDF的RETURN TABLE聲明,GetFoo()
每當v_Foo變化的定義。

但是有一個方法來解決它(譯爲不實用)。

  1. ALTER_VIEW事件中創建DDL觸發器。
  2. 然後使用動態SQL創建GetFoo()
2

這將是很好看函數的定義。你所說的就是使用SELECT *。你可以說得更詳細點嗎?

您還忘了告訴我們您使用的是什麼版本的SQL Server。如果> = 2005,你看過sp_refreshsqlmodule嗎? http://technet.microsoft.com/en-us/library/bb326754.aspxhttp://technet.microsoft.com/en-us/library/bb326754%28SQL.90%29.aspx

好奇你的理由是堅持SELECT *。許多有關這裏討論,但缺點還是以大比分,恕我直言大於優點:

http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/10/bad-habits-to-kick-using-select-omitting-the-column-list.aspx