#sql #sql-server #tsql
#sql-сервер #tsql #переменные #процедура
Вопрос:
Чего я пытаюсь добиться, так это:
Получите входное значение в переменной, например @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»
Вопрос: Чего мне не хватает — и как мне заставить его работать с переменными?
Спасибо!
Комментарии:
1. Можете ли вы добавить синтаксис, который вы используете для объявления
@vNoOfRows
и вызова процедуры хранения?2. Вы не можете использовать переменную здесь (не делая весь запрос динамическим). Проверьте синтаксис для OVER . все , что вам разрешено для указания числа, — это целочисленный литерал без знака.
Ответ №1:
Как было предложено в комментариях, вы могли бы добиться этого с помощью динамического 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;
Комментарии:
1. Пара вопросов выше: есть ли способ получить значение exec @sql в переменной? И с точки зрения производительности, будет ли динамический sql медленнее?
2. Рад, что ваша проблема была решена. Если ответ был полезным, пожалуйста, примите его и поддержите. Спасибо.
3. Я также обновил ответ, чтобы ответить на ваш вопрос о сохранении результата запроса в переменной.
4. Что касается производительности, динамический SQL может быть медленнее, поскольку EXEC по умолчанию не кэширует планы запросов. SP_EXECUTESQL разрешает кэширование.