有没有办法在表值UDF的参数上创建“断言”。
出于性能原因,我想使用表值UDF,但是我知道某些参数组合(比如相隔超过一个月的开始和结束日期)将导致服务器上的所有用户出现性能问题。
最终用户使用UDF通过Excel查询数据库。当数据对于Excel太大时,UDF(特别是表值UDF)非常有用。用户编写简单的SQL查询,将数据分类为组以减少行数。例如,用户可能对每周聚合而不是每小时聚合感兴趣。用户通过SELECT语句编写组以将行减少24x7 = 168次。我知道我可以在多语句UDF中编写RAISERROR语句,但是表值UDF集成在查询优化器中,因此这些查询对于表值UDF更有效。
那么,我可以在传递给表值UDF的参数上定义断言吗?
答案 0 :(得分:1)
简短的答案是否定的 - 单一声明TVF只能包含一个声明。
您可以尝试一些替代方案。一种方法是通过扩展WHERE
子句来执行SQL语句中的参数验证 - 比如
...
WHERE ...
AND DATEDIFF(day, @startDate, @endDate) < 31
由于几个原因,这可能并不理想 - 首先,它可能会导致用户认为没有数据符合他们的标准,因为没有办法沟通为什么没有返回结果。其次,在评估参数之前,无法保证数据库引擎无论如何都不会运行查询的数据部分。第三,它可能导致一个糟糕的计划被缓存。
如果您使用的是SQL 2008,另一种方法是查看SQL server resource govenor,它提供了一种限制用户或用户组运行查询的方法,这些查询的估计执行时间(以秒为单位)小于给定的门槛。
另一种方法是在用户用于查询的Excel工作表中构建一些参数验证,但这可能不太实际,具体取决于您的设置细节。