Вызов функции должен быть примерно таким:
exec procedure get_Last_Row_By_Key ('dbo.customer', 'Customer', 'e_date')
Для поддержки нескольких ключей я бы использовал row_number()
, даже если это добавит дополнительный столбец к набору результатов.Таким образом, динамический SQL будет выглядеть следующим образом:
declare @sql nvarchar(max);
set @sql = '
select t.*
from (select t.*,
row_number() over (partition by [key] order by [datecol]) as seqnum
from [table] t
) t
where seqnum = 1
';
set @sql = replace(@sql, '[table]', @table);
set @sql = replace(@sql, '[key]', @key);
set @sql = replace(@sql, '[datecol]', @datecol);
exec sp_executesql @sql;
Примечание. Я явно не , использующий здесь quotename()
, поэтому в коде будет разрешено несколько столбцов для любого порядка ключей "datecol".
Также в качестве упражнения это может быть полезно для изучения динамического SQL и хранимых процедур.Однако в целом такие попытки «общей» обработки не так полезны, как кажется.Люди, которые знают SQL, знают, как написать запрос, чтобы сделать то, что он хочет на столе;они не знают пользовательских хранимых процедур, которые делают то же самое.