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

时间:2011-09-27 23:23:01

标签: sql sql-server-2008 stored-procedures versioning

我希望编写一个sql server脚本来在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 个答案:

答案 0 :(得分: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