如何在SQL Server中的OVER子句中使用变量

时间:2014-06-14 12:10:34

标签: tsql sql-server-2012 over-clause

我想将一个变量用于'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;

这会在'rows'之后的@var_MA_Low处导致语法错误。

与上述相同的陈述是有效的,但我不能将其用作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;

有人知道如何将行数作为变量传递给第二个选项吗?

2 个答案:

答案 0 :(得分:0)

如果使用工作查询创建存储过程并将该SP用作源?

,该怎么办?

答案 1 :(得分:0)

我可能会尝试改进这个答案,但是如果你使用动态SQL的解决方案并将其与临时表和"插入到... exec ..."语法,https://stackoverflow.com/a/24073229/3591870,然后返回SSIS只需" select * from @ holdertable",SSIS应该能够确定返回的列并生成源。我并不是非常喜欢你需要使用动态SQL来解决这个问题。

根据文档http://msdn.microsoft.com/en-us/library/ms189461(v=sql.120).aspx,它确实指定了"无符号整数文字",所以我认为动态SQL将是唯一的方法。