Как связать параметры в курсоре запроса SQL Server - PullRequest
0 голосов
/ 14 ноября 2018

Oracle:

STR_SQL := ' SELECT ... where x = :1 and y = :2';
OPEN RS FOR STR_SQL USING VAR1, VAR2;

Postgres:

STR_SQL := ' SELECT ... where x = $1 and y = $2';
OPEN RS FOR EXECUTE STR_SQL USING VAR1, VAR2;

Как я могу сделать это в SQL Server? Все, чего я хочу, - это избежать нескольких планов выполнения

EDIT:

Сохраняет ли план выполнения выполнение переменной в запросе с @?

SET @RS  = CURSOR FOR SELECT ... where x = @MY_PROC_PARAMETER 
OPEN @RS;
FETCH NEXT FROM @RS INTO @VRESULT_VALUE;

1 Ответ

0 голосов
/ 14 ноября 2018

Курсоры не очень хорошо работают в 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) . Делать это обычно не гарантируется. Если у вас плохие планы, вы должны вместо этого расследовать почему вы их получаете. то есть статистика, сниффинг параметров и т. д.

...