代码之家  ›  专栏  ›  技术社区  ›  luckyluke

正在刷新用户函数t-sql上的元数据

  •  0
  • luckyluke  · 技术社区  · 14 年前

    我正在做一些T-SQL编程,并且在我的数据库上有一些视图定义。这些天,数据模型仍在变化,我定义了一些表函数。有时我故意使用

     select * from MYVIEW
    

    在这样的表函数中返回所有列。如果视图更改(或表),函数将崩溃,我需要重新编译它。我知道这总的来说是好事,所以它可以防止地狱洛塔错误,但仍然……

    有没有一种方法可以编写这样的函数,这样每当我更改底层表上的某些内容时,都不会在我的脸上爆炸?或者我做了一些完全错误的事情…

    谢谢你的帮助

    2 回复  |  直到 14 年前
        1
  •  2
  •   Community Lee Campbell    7 年前

    将视图定义为“具有架构绑定”

    我会在这里向你介绍我的答案,包括类似的东西…

    “select * from table” vs “select colA,colB,etc from table” interesting behaviour in SqlServer2005

    在这种情况下,问题不在于UDF,而在于视图在没有模式绑定的情况下的行为。

    编辑:Cade Roux的sp_refreshsqlmodule可能会做到这一点。我从来没有用过。

        2
  •  3
  •   Community Lee Campbell    7 年前

    gbn's answer 是最好的——但是当您有模式绑定时,这通常会阻止您在不首先删除模式绑定,然后在重新创建模块时替换它的情况下进行底层更改。如果对象引用数据库外部的对象,则不能使用架构绑定。

    如果这个困难是如此之大,您不希望或不能使用模式绑定,那么使用 sp_refreshsqlmodule 在某种常规的过程中,您的朋友是您的SQL模块(它可以在任何非绑定到架构的视图、UDF、存储过程等上运行),在实际使用之前检查它们是否有错误。

    您可以同时使用这两种技术—您不能(也不需要)对绑定到架构的对象运行sp_refreshsqlmodule。

    例如,您只能在以下模块上运行它:

    SELECT *
    FROM    INFORMATION_SCHEMA.ROUTINES
            WHERE   (
                     OBJECTPROPERTY(OBJECT_ID(QUOTENAME(ROUTINE_SCHEMA) + '.' + QUOTENAME(ROUTINE_NAME)), N'IsSchemaBound') IS NULL
                     OR OBJECTPROPERTY(OBJECT_ID(QUOTENAME(ROUTINE_SCHEMA) + '.' + QUOTENAME(ROUTINE_NAME)),
                                       N'IsSchemaBound') = 0
                    )