MSSQL - 在分层表函数中添加新列

时间:2014-03-05 10:02:43

标签: sql sql-server

我有三个表函数:

第1步:

  1. 功能 func1 ,返回一个选择:
  2. CREATE FUNCTION [dbo].[func1] ()
        RETURNS TABLE AS    
        RETURN 
            (
                SELECT
                    1 AS col1,
                    2 AS col2,
                    3 AS col3
            )
        GO
    
    1. 函数 func2 ,它从func1返回全部内容:
    2. CREATE FUNCTION [dbo].[func2] ()
          RETURNS TABLE AS  
          RETURN 
              (
                  SELECT * FROM func1()
              )
          GO
      
      1. 函数 func3 ,它返回从func2调用的func1中的列,如下所示:
      2. CREATE FUNCTION [dbo].[func3] ()
            RETURNS TABLE AS  
            RETURN 
                (
                    SELECT 
                        col1,
                        col2,
                        col3
                    FROM func2()
                )
            GO
        

        当我在名为 col4 func1 中添加新列时,问题就出现了,我尝试在 func3 中添加相同的列名称。

        第2步:

        1. 更改 func1 以添加新列 col4
        2. 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 ):

          3. 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的改变。

            是其他方法,或者是什么原因?

1 个答案:

答案 0 :(得分:0)

您需要刷新函数,以便sql重新编译它们

EXEC sys.sp_refreshsqlmodule 'func2';

否则sql server只会“看到”旧版本并且没有检测到func2中有变化

MSDN说:

当对模块中影响其定义的对象进行更改时,应运行sp_refreshsqlmodule。否则,在查询或调用模块时,模块可能会产生意外结果。 MSDN