在表值 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 中断言参数的主要内容,如果未能解决你的问题,请参考以下文章

检查多个列在表值参数中具有多个值中的任何一个

将表变量作为参数传递给表值函数

sqlserver 多语句表值函数例子

如何从 UDF 参数提供 SELECT 语句的 FROM 子句

SQL Server用户定义的函数(UDF)使用详解

SQL Server 中的存储过程,它采用表值参数并插入不存在的并返回存在的