Мой совет;не объединять ввод; p (как всегда).Вы все еще можете использовать параметры с EXEC, особенно с sp_ExecuteSQL.Это позволит избежать всех проблем, и , допускающих повторное использование плана запросов.
НИКОГДА не объединять пользовательский ввод, даже в TSQL.ВСЕГДА используйте параметры, если только абсолютно невозможно сделать.
В качестве тривиального примера (в частности, чтобы показать, что имена параметров не должны совпадать):
declare @a int = 15, @b datetime = GETUTCDATE()
declare @sql nvarchar(400) = 'select @x, @y'
exec sp_executeSql @sql, N'@x int, @y datetime', @a, @b
мы передаем @a и @b в качестве параметров (сопоставление с @x и @y) в SQL в @sql и выполняем безопасным, повторно используемым, кэшируемым способом.