我希望编写一个sql server脚本来在sql server 2008数据库中实现以下功能。
我有许多具有以下名称的函数和存储过程:
如您所见,附加了版本号。
每次发布新版本的应用程序时,都会使用新版本号创建新功能/存储过程。
我想要做的是编写一个通用脚本来删除所有旧版本的函数或存储过程。因此,假设当前版本为1.2.0,所有函数和存储过程在此之前以版本号结尾。应该删除1.0.0,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