2012-04-26 61 views
2

將視圖依賴於表的列添加到視圖時,對命名字段的視圖有非常意想不到的影響。添加列到表中會更改視圖的sql

SQL:

SELECT  dbo.AccessCustomFieldDepartment.AccessCustomFieldDepartmentID, dbo.AccessCustomFieldDepartment.AccessCustomField_StoreID, 
         dbo.AccessCustomFieldDepartment.AccessCustomField_ShopOwner, dbo.AccessCustomFieldDepartment.AccessCustomField_CVRnumber, 
         dbo.AccessCustomFieldDepartment.AccessCustomField_OpenMonToWed, dbo.AccessCustomFieldDepartment.AccessCustomField_OpenMonToThu, 
         dbo.AccessCustomFieldDepartment.AccessCustomField_OpenMonToFri, dbo.AccessCustomFieldDepartment.AccessCustomField_OpenMonToTue, 
--.. 
--a bunch of other fields 
--.. 

        dbo.AccessUser.AccessUserAddress, dbo.AccessUser.AccessUserAddress2, dbo.AccessUser.AccessUserZip, dbo.AccessUser.AccessUserCity, 
        dbo.AccessUser.AccessUserCountry, dbo.AccessUser.AccessUserWeb 
FROM   dbo.AccessUser INNER JOIN 
         dbo.AccessCustomFieldDepartment ON dbo.AccessUser.AccessUserID = dbo.AccessCustomFieldDepartment.AccessCustomFieldDepartmentID 

當其他國家的人民代碼做一個動態添加列到表AccessUser,服務器,或者有新的變化視圖的SQL!

EG:

dbo.AccessUser.AccessUserCountry, dbo.AccessUser.AccessUserWeb 

被改爲

dbo.AccessUser.AccessUserCountry AS AccessUserCity, 
dbo.AccessUser.AccessUserWeb AS AccessUserCountry 

這大大F * * * S了我得到的數據的呈現....它的觀點一樣,試圖維持各列的位置。

刪除列奇蹟般地將sql更改爲原始。

所以問題是:

  • 這是怎麼回事?它是服務器嗎? CMS 軟件中的某些功能(其中添加字段功能是)
  • 我可以對視圖進行設置,使其將sql語句視爲100%靜態?

問候,

斯蒂恩

+0

什麼DBMS? Accesss?有沒有鏈接表?通常解決方案是重新組合視圖,這應該是自動發生的,但可能不會。 SQL Server上的sp_recompile。另外,避免在表格末尾添加列,在中間添加它們會造成麻煩,並且從不在視圖中使用*。 – Ben 2012-04-26 10:08:17

+0

A [DDL觸發器](http://msdn.microsoft.com/en-us/library/ms175941.aspx),也許? – 2012-04-26 17:36:05

+0

感謝您的意見。 @本:MS-SQL服務器2008R2。我剛剛在基本視圖中創建,以便從CMS中的現有表中獲取數據。無法控制列添加。已經明確說明了所有的專欄名稱,所以這就是爲什麼我很驚訝地看到chages。還想知道如何避免,但是可以選擇不使用視圖來運行它。... – Steen 2012-04-26 21:08:36

回答

1

重新編譯視圖或程序執行以下命令:

/* View: */ 
exec sp_refreshview 'dbo.MyViewName' 

/* Procedure, FN, IF, TF */ 
exec sp_recompile 'dbo.ProcedureName' 
exec sp_recompile 'dbo.ScalarFunctionName' 
exec sp_recompile 'dbo.InlineFunctionName' 
exec sp_recompile 'dbo.TableFunctionName' 

你可以得到的對象從系統對象的列表。將它們選入表變量應該相對容易,並生成一個依次重新編譯每個循環的循環。

set nocount on 
declare @o table(
    id int primary key, 
    object_full_name nvarchar(1000), 
    xtype nvarchar(20) 
) 
insert @o 
select 
    id, object_schema_name(id) + '.' + object_name(id) as object_full_name, xtype 
from sysobjects so 
where 
    xtype in ('V', 'P', 'FN', 'TF', 'IF') 


while exists (select 1 from @o) 
begin 
    declare @id int 
    declare @object_full_name nvarchar(1000) 
    declare @xtype nvarchar(20) 
    set @id = null 
    select top 1 @id = id, @object_full_name = object_full_name, @xtype = xtype from @o order by xtype, object_full_name, id 
    delete @o where id = @id 
    if @xtype = 'V' 
    begin 
     raiserror('Marking for recompile - %s: %s', 0, 1, @xtype, @object_full_name) 
     exec dbo.sp_refreshview @object_full_name 
    end 
    else 
    begin 
     raiserror('Marking for recompile - %s: %s', 0, 1, @xtype, @object_full_name) 
     exec dbo.sp_recompile @object_full_name 
    end 
end 

您也可以考慮DDL觸發器按需執行此操作。

+0

感謝您的關注......由於客戶不會爲實施付費,並且可以通過不使用視圖輕鬆解決問題,但我永遠不會去測試這一點,但仍然......謝謝! – Steen 2012-05-02 11:59:35