Вы можете использовать это как отправную точку и посмотреть, как далеко вы можете зайти. Запустите его против своей БД и опубликуйте свои наблюдения. Последний выбор только перечисляет оператор SQL в последнем столбце. Ничто не выполняется на самом деле. Очень внимательно проверьте вывод.
;With RawData As
(
SELECT
name
, SUBSTRING(name, 1, CHARINDEX('.', name) - 1) AS BaseName
, CAST(REPLACE(SUBSTRING(name, CHARINDEX('.', name), LEN(name) - CHARINDEX('.', name) + 1), '.', '') AS INT) AS IntVersion
FROM
sys.objects
WHERE
type = 'P'
AND
CHARINDEX('.', name) > 0
AND
ISNUMERIC(REPLACE(SUBSTRING(name, CHARINDEX('.', name), LEN(name) - CHARINDEX('.', name) + 1), '.', '')) = 1
)
,GroupedData As
(
SELECT
BaseName
, MAX(CAST(REPLACE(SUBSTRING(name, CHARINDEX('.', name), LEN(name) - CHARINDEX('.', name) + 1), '.', '') AS INT)) AS IntVersion
FROM
RawData
GROUP BY
BaseName
)
SELECT
*
, NULLIF(ISNULL(GD.BaseName, ''), ISNULL(GD.BaseName, '-')) + 'DROP PROCEDURE [' + Name + ']' as SQLs
FROM
RawData RD
LEFT JOIN
GroupedData GD
ON
RD.BaseName = GD.BaseName
AND
RD.IntVersion = GD.IntVersion
--WHERE
-- GD.BaseName IS NULL
ORDER BY
RD.BaseName
, RD.IntVersion