Курсоры не очень хорошо работают в SQL Server или в любом другом цикле, поэтому я бы их избегал. Эквивалентом для привязки параметров к динамическому SQL в SQL Server будет sp_executesql . Вы также можете просто создать объединенную строку запроса и выполнить ее:
declare @x int = 1
declare @y int = 2
declare @sql varchar(max) = 'select * from table where x = ' + cast(@x as varchar) + ' and y = ' + cast(@y as varchar)
print @sql
--exec @sql
Приведение необходимо к датам, числам и другим типам данных, чтобы +
считался конкатенацией, а не арифметикой.
Но, если вам действительно нужен новый план выполнения для вашего запроса, вы можете добавить подсказку запроса OPTION (RECOMPILE) . Делать это обычно не гарантируется. Если у вас плохие планы, вы должны вместо этого расследовать почему вы их получаете. то есть статистика, сниффинг параметров и т. д.