小编典典

sql脚本删除存储过程和函数的旧版本

sql

我正在寻找编写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等应删除。

我有什么技巧或想法可以编写脚本来实现这一目标?


阅读 130

收藏
2021-05-16

共1个答案

小编典典

您可以以此为起点,看看可以带您走多远。针对您的数据库运行它并发布您的观察结果。最后一个选择仅在最后一列中列出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
2021-05-16