簡體   English   中英

MSSQL-在層次表函數中添加新列

[英]MSSQL - add new column in hierarchical table funcions

我有三個表函數:

第1步:

  1. 函數func1返回一個選擇:
CREATE FUNCTION [dbo].[func1] ()
    RETURNS TABLE AS    
    RETURN 
        (
            SELECT
                1 AS col1,
                2 AS col2,
                3 AS col3
        )
    GO
  1. 函數func2從func1返回全部:
CREATE FUNCTION [dbo].[func2] ()
    RETURNS TABLE AS  
    RETURN 
        (
            SELECT * FROM func1()
        )
    GO
  1. 函數func3返回從func2調用的func1中的列,如下所示:
CREATE FUNCTION [dbo].[func3] ()
    RETURNS TABLE AS  
    RETURN 
        (
            SELECT 
                col1,
                col2,
                col3
            FROM func2()
        )
    GO

當我在func1中添加名為col4的新列,並嘗試在func3中添加相同名稱的列時,問題就變成了。

第2步:

  1. 更改func1以添加新列col4
ALTER FUNCTION [dbo].[func1] ()
    RETURNS TABLE AS    
    RETURN 
        (
            SELECT
                1 AS col1,
                2 AS col2,
                3 AS col3,
                4 AS col4, --the new column
        )
    GO
  1. func2保持不變,因為是“從func1中選擇所有列”。

  2. 更改func3以從func1( col4 )添加同一列:

ALTER FUNCTION [dbo].[func3] ()
    RETURNS TABLE AS  
    RETURN 
        (
            SELECT 
                col1,
                col2,
                col3,
                col4, -- the new column from func1
            FROM func2()
        )
    GO

當我運行此最后一個查詢時,我收到此錯誤消息:

消息207,級別16,狀態1,過程func3,行11無效的列名稱'col4'。

我的問題是:MSSQL在緩存中保存了一些引用? 我嘗試重新啟動SQL Server,但是此解決方案不起作用。

我發現的唯一方法是更改​​func2時保持不變,然后運行func3的alter。

是其他方法還是什么原因?

您需要刷新功能,以便sql重新編譯它們

EXEC sys.sp_refreshsqlmodule 'func2';

否則,SQL Server將僅“查看”舊版本,而不會檢測到func2中已有更改。

MSDN說:

對影響其定義的模塊基礎對象進行更改時,應運行sp_refreshsqlmodule。 否則,查詢或調用模塊時可能會產生意外結果。 MSDN

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM