2009-11-15 88 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