none
修改表结构后,如何只刷新相关联的视图? RRS feed

  • 问题

  • 数据库中用了很多视图来做表关联,现在只要修改了一个表,就需要遍历刷新sp_refreshview下视图,而且有些视图是嵌套另一个视图的,有可能因为顺序的问题导致没有刷新成功,现在的做法是刷新多几次,感觉这种办法不太好用,刷新的时间也长.能不能只刷新相关联的视图呢?请大家帮助!
    2013年6月18日 5:30

答案

  • 脚本可更新与更改对象有依赖关系的所有视图:

    SELECT DISTINCT 'EXEC sp_refreshview ''' + name + ''''
    FROM sys.objects so INNER JOIN sys.sql_dependencies sd
    ON so.object_id = sd.object_id
    WHERE type = 'V'
    AND sd.referenced_major_id = object_id('Person.Contact')

    但是如果VIEW再被其他的View调用这个就查不出来了。


    Please Mark As Answer if it is helpful.

    • 已标记为答案 zyyjc 2013年6月29日 11:30
    2013年6月18日 7:21
  • 自己写一个递归的就查出来了。写递归的时候注意避免自身引用。

    想不想时已是想,不如不想都不想。

    • 已标记为答案 zyyjc 2013年6月29日 11:30
    2013年6月19日 2:34
    版主
  • 或許您可以參考MSDN上面有關sp_refreshview這個系統預存程序,其中有段程式碼或許符合你的需求:

    【以下轉貼自MSDN】
    假設資料表 Person.Person 是以會影響在任何檢視上建立的定義之方式來變更。  下列範例建立了一個指令碼,針對所有對資料表 Person.Person 有相依性的檢視來重新整理中繼資料。

    USE AdventureWorks2012;
    GO
    SELECT DISTINCT 'EXEC sp_refreshview ''' + name + '''' 
    FROM sys.objects AS so 
    INNER JOIN sys.sql_expression_dependencies AS sed 
        ON so.object_id = sed.referencing_id 
    WHERE so.type = 'V' AND sed.referenced_id = OBJECT_ID('Person.Person');


    以上說明若有錯誤請指教,謝謝。

    | 台灣 SQL PASS 社群 | SQL PASS Taiwan

    | 歡迎參觀我的BLOG - 積沙成塔

    • 已标记为答案 zyyjc 2013年6月29日 11:30
    2013年6月19日 8:25

全部回复

  • 你都不看联机丛书的?

    想不想时已是想,不如不想都不想。

    2013年6月18日 6:06
    版主
  • 脚本可更新与更改对象有依赖关系的所有视图:

    SELECT DISTINCT 'EXEC sp_refreshview ''' + name + ''''
    FROM sys.objects so INNER JOIN sys.sql_dependencies sd
    ON so.object_id = sd.object_id
    WHERE type = 'V'
    AND sd.referenced_major_id = object_id('Person.Contact')

    但是如果VIEW再被其他的View调用这个就查不出来了。


    Please Mark As Answer if it is helpful.

    • 已标记为答案 zyyjc 2013年6月29日 11:30
    2013年6月18日 7:21
  • 自己写一个递归的就查出来了。写递归的时候注意避免自身引用。

    想不想时已是想,不如不想都不想。

    • 已标记为答案 zyyjc 2013年6月29日 11:30
    2013年6月19日 2:34
    版主
  • 或許您可以參考MSDN上面有關sp_refreshview這個系統預存程序,其中有段程式碼或許符合你的需求:

    【以下轉貼自MSDN】
    假設資料表 Person.Person 是以會影響在任何檢視上建立的定義之方式來變更。  下列範例建立了一個指令碼,針對所有對資料表 Person.Person 有相依性的檢視來重新整理中繼資料。

    USE AdventureWorks2012;
    GO
    SELECT DISTINCT 'EXEC sp_refreshview ''' + name + '''' 
    FROM sys.objects AS so 
    INNER JOIN sys.sql_expression_dependencies AS sed 
        ON so.object_id = sed.referencing_id 
    WHERE so.type = 'V' AND sed.referenced_id = OBJECT_ID('Person.Person');


    以上說明若有錯誤請指教,謝謝。

    | 台灣 SQL PASS 社群 | SQL PASS Taiwan

    | 歡迎參觀我的BLOG - 積沙成塔

    • 已标记为答案 zyyjc 2013年6月29日 11:30
    2013年6月19日 8:25