繁体   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