Использование переменной в хранимой процедуре в СТРОКАХ МЕЖДУ предложениями

#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 разрешает кэширование.