【问题标题】:Table-valued function refresh表值函数刷新
【发布时间】:2017-08-25 03:52:05
【问题描述】:

我在 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:Select * 在 TVF 中用于获取所有列。

【问题讨论】:

  • 嗨,masa rhian,我如何刷新视图? 'xyz' 是一个表,当我直接查询此表时,我可以看到填充了新字段。
  • 嗯,有 930 个字段,显式编写它们是一场噩梦。此外,还有几个表,我需要为其添加一列。我想知道,为什么它没有显示一个新列?我想,TVF 每次调用都会执行函数。

标签: sql-server database-metadata


【解决方案1】:

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

为了刷新 TVF,需要执行以下 SP:

EXEC sys.sp_refreshsqlmodule 'TVF_xyz'

【讨论】:

  • 通常你不会...但是根据 msdn 因此,返回的行集结构是隐式定义的。
  • 对不起,我没听懂你的说法。根据 MS Technet 页面(我的答案中的链接) sp_refreshsqlmodule 用于:更新指定的非模式绑定存储过程、用户定义函数、视图、DML 触发器、数据库级 DDL 触发器或服务器级 DDL 的元数据在当前数据库中触发。这些对象的持久元数据(例如参数的数据类型)可能会因为其底层对象的更改而过时。
  • 我想避免这种情况 MSDN 建议定义表结构,因为作为标准我们不使用 SELECT *
  • 我不确定,这与我的问题有什么关系。不过,我很高兴,我能够理解 TVF 的工作原理以及如何刷新元数据。
  • 这很重要,因为我们通常不会在更改某些内容后刷新数据。如果您想简化流程,那就是这样。
【解决方案2】:

https://msdn.microsoft.com/en-us/library/bb386954(v=vs.110).aspx

以下 SQL 函数明确声明它返回一个 TABLE。因此,返回的行集结构是隐式定义的。

样本

CREATE FUNCTION ProductsCostingMoreThan(@cost money)  
RETURNS TABLE  
AS  
RETURN  
    SELECT ProductID, UnitPrice  
    FROM Products  
    WHERE UnitPrice > @cost  

【讨论】:

    猜你喜欢
    • 2017-03-23
    • 1970-01-01
    • 2016-02-25
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 2011-06-21
    • 2017-08-05
    相关资源
    最近更新 更多