我有一个简单的用例,我正在创建一个表,用一些基本信息填充它并创建一个表值函数,在这种情况下,如果名称为'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
所以我有两个问题。
有没有办法从函数中删除列,或刷新 在Alter之后以某种方式运作?
鉴于我在选择*中遇到了这些问题 表值函数实际定义它会更好 结果表的列结构,还是在那里做我做的事情 需要选择*,在改变时不需要太多保养 基础表出现了吗?
由于
这是测试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
答案 0 :(得分:6)
我认为您应该使用刷新模块系统功能,如下所示。
EXEC sys.sp_refreshsqlmodule 'dbo.GetApples';