如何在 SQL Server 的 OVER 子句中使用变量
Posted
技术标签:
【中文标题】如何在 SQL Server 的 OVER 子句中使用变量【英文标题】:How to use variable in OVER clause in SQL Server 【发布时间】:2014-06-14 12:10:34 【问题描述】:我想为“OVER 子句”语句中使用的行数使用一个变量。到目前为止,我只能通过在字符串中创建 sql 语句然后执行它来使其工作。
虽然最终目的也是在 SSIS 中使用它,但它无法识别动态查询中的字段。
有效的是:
select
[GUID_Fund], [Date], [Close],
avg([Close]) over (order by [GUID_Fund], [Date] rows 7 preceding) as MA_Low
from fundrates
group by [GUID_Fund], [Date], [Close]
order by [GUID_Fund] asc, [Date] desc;
数字 7 需要是一个变量,所以我试图做这样的事情:
declare @var_MA_Low as int;
select distinct @var_MA_Low = [Value1]
from Variables
where [Name]='MA_Low';
select
[GUID_Fund], [Date], [Close],
avg([Close]) over (order by [GUID_Fund], [Date] rows @var_MA_Low preceding) as MA_Low
from fundrates
group by [GUID_Fund], [Date], [Close]
order by [GUID_Fund] asc, [Date] desc;
这会导致 @var_MA_Low 在 'rows' 之后出现语法错误。
与上面的语句相同,但我不能将它用作 SSIS 中的源:
declare @MA as nvarchar(max);
declare @var_MA_Low as nvarchar(max);
select distinct @var_MA_Low = [Value1] from Variables where [Name]='MA_Low';
set @MA = N'select [GUID_Fund], [Date], [Close], avg([Close])
over (order by [GUID_Fund], [Date] rows '+@var_MA_Low+' preceding) as MA_Low
from fundrates
group by [GUID_Fund], [Date], [Close] order by [GUID_Fund] asc, [Date] desc;'
execute sp_executesql @MA;
有人知道如何将行数作为变量传递给第二个选项吗?
【问题讨论】:
【参考方案1】:如果您使用工作查询创建存储过程并将该 SP 用作源会怎样?
【讨论】:
尚未研究这种可能性。我正在研究 SSIS 的可能性,而有人提到几乎所有可以用 T-SQL 做的事情都可以由 SSIS 完成。所以我尽量避免使用 SP。 与此同时,我尝试了 SP 作为可能的替代方案,但这留下了同样的挑战。 SSIS 源无法检索要映射到输出的列。【参考方案2】:我可能会尝试改进这个答案,但是如果您采用使用动态 SQL 的解决方案并将其与临时表和“插入... exec ...”语法相结合,https://***.com/a/24073229/3591870 和然后只返回“从@holdertable中选择*”返回SSIS,SSIS应该能够确定要返回的列并生成您的源。不过,我真的不喜欢你需要使用动态 SQL 来解决这个问题。
根据文档,http://msdn.microsoft.com/en-us/library/ms189461(v=sql.120).aspx,它确实指定了“无符号整数文字”,所以我认为动态 SQL 将是唯一的方法。
【讨论】:
谢谢,这确实可以解决问题。现在我将“执行 T-Sql 语句任务”与“数据流任务”结合起来。不是最漂亮的解决方案,但它有效。 您应该能够在单个数据流任务中完成。以上是关于如何在 SQL Server 的 OVER 子句中使用变量的主要内容,如果未能解决你的问题,请参考以下文章