刷新表值函数

6

我在SQL Server中有一个类似下面这样的表值函数(TVF):

CREATE FUNCTION TVF_xyz(@AuditKey INT)
RETURNS TABLE
AS
    RETURN
        SELECT *
        FROM xyz 
        WHERE AUDIT_KEY = @AuditKey
GO

现在,我向xyz表添加了一列。

当我使用TVF_xyz查询时,它不会显示新列(显示除新增列之外的所有其他列)。

查询:

SELECT TOP 10 * 
FROM TVF_xyz (1543)

我想知道如何刷新 TVF 以显示新列。
PS:在 TVF 中使用 Select * 来获取所有列。

嗨,Rhian大师,我该如何刷新视图?'xyz'是一张表,当我直接查询这个表时,我可以看到新的字段被填充了。 - Ash
也许 https://dev59.com/OHRC5IYBdhLWcg3wAcQ3 能帮到你。 - TriV
好的,有930个字段,明确地编写它们是一场噩梦。此外,还有几个表格,我需要添加一列。我在想,为什么没有显示新列?我认为,TVF每次调用函数时都会执行。 - Ash
2个回答

6

经过一番搜索,我找到了sp_refreshsqlmodule (Transact-SQL),这是TVF的常见行为。

要刷新TVF,需要执行以下存储过程:

EXEC sys.sp_refreshsqlmodule 'TVF_xyz'

通常情况下,您不会这样做,但根据 MSDN 的规定,返回的行集结构是隐式定义的。 - RoMEoMusTDiE
抱歉,我不理解你的陈述。根据我的回答中提供的MS Technet页面,sp_refreshsqlmodule用于更新当前数据库中指定的非模式绑定存储过程、用户定义函数、视图、DML触发器、数据库级DDL触发器或服务器级DDL触发器的元数据。这些对象的持久元数据,例如参数的数据类型,可能会因为底层对象的更改而过时。 - Ash
我猜为了避免那种情况,MSDN建议定义表结构,因为作为标准,我们不使用SELECT *。 - RoMEoMusTDiE
我不确定那与我的问题有什么关系。但是,我很高兴我能够理解TVF的工作原理以及如何刷新元数据。 - Ash
这非常重要,因为我们通常在更改某些内容后不会刷新元数据。如果您想简化流程的话。 - RoMEoMusTDiE
总的来说,使用明确的列名是有意义的。然而,在我的情况下,我有930个字段,我确实知道我将再添加一个字段,并准备好满足以后的元数据更改。无论如何,谢谢您的建议。 - Ash

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接