Как правильно сказал @Jeroen Mostert в комментариях, вам нужно использовать sp_executesql
вместо EXEC
.
sp_executesql
позволяет предоставлять параметры для динамического SQL иэти параметры можно пометить как OUTPUT
, что вам нужно здесь.
Кроме того, полезно использовать правильные параметры, чтобы предотвратить проблемы с внедрением SQL.В вашем примере @MinDate
и @MaxDate
могут и должны быть заданы как правильные параметры.@Table
не может стать параметром, поэтому он останется связанным со строкой SQL.Только эта часть останется открытой для SQL-инъекций.
Вот пример:
DECLARE @MinDate_ VARCHAR(10) = '';
DECLARE @MaxDate_ VARCHAR(10) = '';
DECLARE @SQL nvarchar(max);
SET @SQL =
'SELECT
@MinDate = Convert(Varchar,Cast(Min(ColumnDate) AS DATE),105),
@MaxDate = Convert(Varchar,Cast(Max(ColumnDate) AS DATE),105)
FROM ['+@Table+']';
EXEC sp_executesql @SQL
,N'@MinDate VARCHAR(10) OUTPUT, @MaxDate VARCHAR(10) OUTPUT'
,@MinDate = @MinDate_ OUTPUT
,@MaxDate = @MaxDate_ OUTPUT
;
SELECT @MinDate_, @MaxDate_;
Обратите внимание, что вам нужно указать OUTPUT
дважды.
Вы можетеиспользуйте одно и то же имя @MinDate
для параметра, который вы объявляете вне динамического SQL и внутри динамического SQL, но я предпочитаю давать им разные имена (@MinDate
и @MinDate_
), поэтому меня не смущает, что к чему.