在表值 UDF 中断言参数
Posted
技术标签:
【中文标题】在表值 UDF 中断言参数【英文标题】:Assert parameters in a table-valued UDF 【发布时间】:2011-01-14 09:29:29 【问题描述】:有没有办法在表值 UDF 的参数上创建“断言”。
出于性能原因,我想使用表值 UDF,但是我知道某些参数组合(例如相隔一个多月的开始日期和结束日期)会导致所有用户在服务器上出现性能问题。
最终用户使用 UDF 通过 Excel 查询数据库。当数据对于 Excel 来说太大时,UDF(尤其是表值 UDF)很有用。用户编写简单的 SQL 查询,将数据分类成组以减少行数。例如,用户可能对每周汇总而不是每小时汇总感兴趣。用户通过 SELECT 语句编写 group 以将行数减少 24x7=168 倍。我知道我可以在多语句 UDF 中编写 RAISERROR 语句,但是表值 UDF 集成在查询优化器中,因此这些查询使用表值 UDF 更有效。
那么,我可以在传递给表值 UDF 的参数上定义断言吗?
【问题讨论】:
【参考方案1】:简短的回答是否定的——单个语句 TVF 只能包含单个语句。
您可以尝试几种替代方法。一种是通过扩展WHERE
子句来验证 SQL 语句中的参数 - 就像
...
WHERE ...
AND DATEDIFF(day, @startDate, @endDate) < 31
这可能并不理想,原因有两个 - 首先,它可能会导致用户认为不存在符合其标准的数据,因为无法说明未返回结果的原因。其次,不能保证数据库引擎在评估参数之前不会运行查询的数据部分。第三,它可能会导致一个糟糕的计划被缓存。
如果您使用的是 SQL 2008,另一种方法是查看 SQL server resource govenor,它提供了一种方法来限制用户或用户组以运行估计执行时间(以秒为单位)小于给定时间的查询阈值。
另一种方法是在您的用户用于查询的 Excel 工作表中构建一些参数验证,但这可能不切实际,具体取决于您的设置细节。
【讨论】:
以上是关于在表值 UDF 中断言参数的主要内容,如果未能解决你的问题,请参考以下文章