【问题标题】:Assert parameters in a table-valued UDF在表值 UDF 中断言参数
【发布时间】:2011-01-14 09:29:29
【问题描述】:

有没有办法在表值 UDF 的参数上创建“断言”。

出于性能原因,我想使用表值 UDF,但是我知道某些参数组合(例如相隔一个多月的开始日期和结束日期)会导致所有用户在服务器上出现性能问题。

最终用户使用 UDF 通过 Excel 查询数据库。当数据对于 Excel 来说太大时,UDF(尤其是表值 UDF)很有用。用户编写简单的 SQL 查询,将数据分类成组以减少行数。例如,用户可能对每周汇总而不是每小时汇总感兴趣。用户通过 SELECT 语句编写 group 以将行数减少 24x7=168 倍。我知道我可以在多语句 UDF 中编写 RAISERROR 语句,但是表值 UDF 集成在查询优化器中,因此这些查询使用表值 UDF 更有效。

那么,我可以在传递给表值 UDF 的参数上定义断言吗?

【问题讨论】:

    标签: sql-server tsql user-defined-functions


    【解决方案1】:

    简短的回答是否定的——单个语句 TVF 只能包含单个语句。

    您可以尝试几种替代方法。一种是通过扩展WHERE 子句来验证 SQL 语句中的参数 - 就像

    ...
    WHERE ...
    AND DATEDIFF(day, @startDate, @endDate) < 31
    

    这可能并不理想,原因有两个 - 首先,它可能会导致用户认为不存在符合其标准的数据,因为无法说明未返回结果的原因。其次,不能保证数据库引擎在评估参数之前不会运行查询的数据部分。第三,它可能会导致一个糟糕的计划被缓存。

    如果您使用的是 SQL 2008,另一种方法是查看 SQL server resource govenor,它提供了一种方法来限制用户或用户组以运行估计执行时间(以秒为单位)小于给定时间的查询阈值。

    另一种方法是在您的用户用于查询的 Excel 工作表中构建一些参数验证,但这可能不切实际,具体取决于您的设置细节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-08
      • 1970-01-01
      • 1970-01-01
      • 2017-05-26
      • 1970-01-01
      • 1970-01-01
      • 2018-10-21
      • 1970-01-01
      相关资源
      最近更新 更多