Вы можете использовать параметр OUTPUT
в sp_executesql :
ALTER PROCEDURE [dbo].[sp_astm_getcurrid]
@ColName as nvarchar(250),
@TblName as nvarchar(250),
@curr_id nvarchar(max) OUTPUT
AS
BEGIN
DECLARE
@cmd nvarchar(max)
SET @cmd =N'SELECT @curr_id_out = MAX('+@ColName+') FROM '+@TblName
EXEC sp_executesql
@cmd,
N'@curr_id_out nvarchar(max) OUTPUT',
@curr_id_out = @curr_id OUTPUT
END
Было бы упущением не упомянуть, что в этом случае использование EXEC (@cmd) или sp_executesql (@cmd) делает вас уязвимым для SQL-инъекций атак.
Я рекомендую добавить что-то вроде следующего в начало хранимой процедуры:
SELECT
@ColName = REPLACE(
REPLACE(
REPLACE(@ColName, ';', ''), '-', ''), '''', ''),
@TblName = REPLACE(
REPLACE(
REPLACE(@TblName, ';', ''), '-', ''), '''', '')