SQL скрипт для удаления старых версий хранимых процедур и функций - PullRequest
0 голосов
/ 28 сентября 2011

Я хочу написать сценарий сервера SQL для достижения следующих целей в базе данных SQL Server 2008.

У меня есть ряд функций и хранимых процедур со следующими именами:

  • prSP_GetItem.1.0.0
  • prSP_GetItem.1.1.0
  • prSp_GetItem.1.2.0

Как вы видите, к ним добавляется номер версии.

Каждый раз, когда выпускается новая версия приложения, новые функции / хранимые процедуры создаются с новым номером версии.

Я хотел бы написать общий сценарий для удаления всехстарая версия функции или хранимых процедур.Допустим, текущая версия 1.2.0, все функции и хранимые процедуры заканчиваются номером версии до этого, например.1.0.0, 1.1.1 и т. Д. Должны быть исключены.

Какие-либо советы или идеи, как я мог бы написать сценарий для достижения этой цели?

1 Ответ

1 голос
/ 28 сентября 2011

Вы можете использовать это как отправную точку и посмотреть, как далеко вы можете зайти. Запустите его против своей БД и опубликуйте свои наблюдения. Последний выбор только перечисляет оператор 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
...