更改基础表后,从表值函数中删除列

时间:2014-04-15 19:14:28

标签: sql-server tsql

我有一个简单的用例,我正在创建一个表,用一些基本信息填充它并创建一个表值函数,在这种情况下,如果名称为'Apple',则只返回一行。

Select * from FruitTable Where Name = 'Apple'

一切正常,直到我决定不再需要Active列,然后从表中删除它。重新运行该功能后,我收到此错误

-- Use the function it fails Msg 4502, Level 16, State 1, Line 1
-- View or function 'GetApples' has more column names specified than columns defined.

Select * from GetApples()

我环顾四周,看看这是一个有关视图的事件,如果一个表被更改,但是这个函数我从FruitTable中选择*并且预计如果对Fruit表做了任何更改,无论是添加还是将来删除列,Select *将是有益的,因为我不必定义结果表的列结构。

此外,我刚刚在函数上执行了一个SP_Help,并注意到它看起来像即使我做了一个select *,实际上存储了关于列的元数据。

SP_Help GetApples
--Column_name   Type
--Id            int
--Name          varchar
--Active        bit

所以我有两个问题。

  1. 有没有办法从函数中删除列,或刷新 在Alter之后以某种方式运作?

  2. 鉴于我在选择*中遇到了这些问题 表值函数实际定义它会更好 结果表的列结构,还是在那里做我做的事情 需要选择*,在改变时不需要太多保养 基础表出现了吗?

  3. 由于

    这是测试SQL

    -- Create the Simple Table Fill in Some Values
    Create Table FruitTable(Id int, Name varchar(50), Active bit)
    Insert Into FruitTable values 
    (1 , 'Apple', 1),
    (2 , 'Pear', 0),
    (3 , 'Orange', 0)
    
    GO
    
    -- Create a Basic Function
    Create Function GetApples()
    Returns Table 
    As
    Return(
            Select * from FruitTable Where Name = 'Apple'
           )
    GO
    
    -- Use the function it works and returns 
    --Id    Name    Active
    --1    Apple    1
    Select * from GetApples()
    Go 
    
    -- Drop Active
    Alter Table FruitTable Drop Column [Active]
    GO
    
    
    -- Use the function it fails Msg 4502, Level 16, State 1, Line 1
    -- View or function 'GetApples' has more column names specified than columns defined.
    
    Select * from GetApples()
    Go 
    

1 个答案:

答案 0 :(得分:6)

我认为您应该使用刷新模块系统功能,如下所示。

EXEC sys.sp_refreshsqlmodule 'dbo.GetApples';