我正在寻找编写sql服务器脚本以在sql server 2008数据库中实现以下目的。
我有许多具有以下名称的函数和存储过程:
如您所见,版本号附加在它们的后面。
每次发布新版本的应用程序时,都会使用新版本号创建新功能/存储过程。
我想做的是编写一个通用脚本来删除功能或存储过程的所有旧版本。因此,可以说当前版本为1.2.0,例如,所有函数和存储过程都以版本号结尾。1.0.0、1.1.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