在 ROWS BETWEEN 子句的存储过程中使用变量

Posted

技术标签:

【中文标题】在 ROWS BETWEEN 子句的存储过程中使用变量【英文标题】:Using variable in Stored Procedure in ROWS BETWEEN clause 【发布时间】:2019-03-28 14:33:28 【问题描述】:

我想要达到的是:

在变量中获取输入值,例如@vNoOfRows = 5 并使用变量获取AVG(marks_total) 如下:

select avg(marks_total) over (partition by CourseName order by BatchID rows between @vNoOfRows preceding and current row)

如果我将@vNoOfRows 替换为任何数字,例如5,但在尝试使变量工作时出现以下编译错误:

“@vNoOfRows”附近的语法不正确

问题:我缺少什么 - 以及如何让它与变量一起使用?

谢谢!

【问题讨论】:

您可以添加您使用的声明@vNoOfRows 并调用存储过程的语法吗? 您不能在此处使用变量(不使整个查询动态化)。查看Syntax for OVER。 所有你可以指定一个数字是一个无符号整数文字 【参考方案1】:

按照 cmets 中的建议,您可以使用动态 SQL 来实现:

declare @vNoOfRows int = 5
declare @sql varchar(4000)

set @sql = 'select avg(marks_total) over(partition by CourseName order by BatchID rows between ' + convert(varchar,@vNoOfRows) + ' preceding and current row) from someTable'
exec @sql

响应您的评论,如果您想将查询结果推送到变量中,您可以这样做:

declare @vNoOfRows int = 5
declare @sql nvarchar(max)
declare @output int

set @sql = 'select @output = avg(marks_total) over(partition by CourseName order by BatchID rows between ' + convert(nvarchar(11), @vNoOfRows) + ' preceding and current row) from someTable'
exec sp_executesql @sql,
    N'@output int OUTPUT',
    @output = @output OUTPUT;

【讨论】:

上面的几个问题:有没有办法将 exec @sql 的值放入变量中?而且从性能的角度来看,动态sql会不会更慢? 很高兴您的问题已经解决。如果回答对您有帮助,请采纳并点赞。谢谢。 我还更新了答案以回答您关于将查询结果存储在变量中的问题。 在性能方面,动态 SQL 可能会更慢,因为 EXEC 默认不缓存查询计划。 SP_EXECUTESQL 允许缓存。

以上是关于在 ROWS BETWEEN 子句的存储过程中使用变量的主要内容,如果未能解决你的问题,请参考以下文章

使用 between 子句搜索逗号分隔值

在 NodeJS 中使用 BETWEEN 子句

在 SQL IN 子句中使用 between

Oracle Between(范围)子句

Oracle Between(范围)子句

Oracle Between子句