gpt4 book ai didi

sql-server - 更改基础表后从表值函数中删除列

转载 作者:行者123 更新时间:2023-12-02 18:47:25 24 4
gpt4 key购买 nike

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

Select * from FruitTable Where Name = 'Apple'

一切正常,直到我决定不再需要“事件”列并将其从表中删除。重新运行该函数后,我收到此错误

-- 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()

我环顾四周,发现如果表被更改, View 就会发生这种情况,但是使用此函数,我从 FruitTable 中选择 * ,并预计如果对 Fruit 表进行任何更改,无论是添加还是添加将来删除 Select * 的列将是有益的,因为我不必定义结果表的列结构。

此外,我刚刚对该函数执行了 SP_Help,并注意到即使我执行了 select *,实际上也存储了有关列的元数据。

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

所以我有两个问题。

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

  2. 鉴于我在 select * 中遇到了这些问题表值函数最好实际定义生成的表列结构,或者是否可以做我的事情希望使用 select * 在更改时不需要太多维护基础表出现?

谢谢

这是测试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

最佳答案

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

EXEC sys.sp_refreshsqlmodule 'dbo.GetApples';

关于sql-server - 更改基础表后从表值函数中删除列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23092433/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com