Как использовать переменную в предложении OVER в SQL Server

Я хотел бы использовать переменную для количества строк, используемых в операторе 'OVER clause'. До сих пор я работал только путем создания оператора 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 сразу после "строк".

То, что работает, это то же утверждение, что и выше, но я не могу использовать его в качестве источника в 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 ответа

Я мог бы попытаться улучшить этот ответ, но если вы возьмете свое решение, которое работает с использованием динамического SQL, и объедините его с временной таблицей и синтаксисом "вставить в... exec ... ", /questions/40655878/hranimaya-protsedura-prevratit-imya-tablitsyi-v-peremennuyu-tablitsyi/40655898#40655898, а затем верните обратно в SSIS только "select * from @holdertable", SSIS должна быть в состоянии определить возвращаемые столбцы и сгенерировать ваш источник. Мне не очень нравится тот факт, что вы должны использовать динамический SQL для решения этой проблемы.

Согласно документам, http://msdn.microsoft.com/en-us/library/ms189461(v=sql.120).aspx, он действительно указывает "целочисленный литерал без знака", поэтому я думаю, что динамический SQL будет быть единственным способом.

Что делать, если вы создаете хранимую процедуру с рабочим запросом и используете этот SP в качестве источника?

Другие вопросы по тегам