在质量检查环境中,我们为开发人员还原数据库,如果还原完成> 30天,则将其删除。这些还原的数据库的命名约定为MyCompany-HA_DBName_20191114_FirstL。
我需要创建一个脚本来删除30天以上的数据库,并每天通过SQL Agent作业运行此脚本以查找和删除30天以上的数据库。但是,我担心的是,还有其他具有相似命名约定(名称中不包括日期)的数据库将被删除。我在where子句的查询中排除了所有重要的数据库,但是我担心将要添加到服务器中的新数据库不应该删除。
我只需要返回名称早于30天的数据库,就需要帮助。到目前为止,我已经创建了以下查询,但是它没有返回某些数据库。我使用了like运算符,但有误。
感谢您的帮助。
IF OBJECT_ID('tempdb..#ListofDbsToDrop') IS NOT NULL DROP Table #ListofDbsToDrop
SELECT * INTO #ListofDbsToDrop
FROM (
SELECT * FROM SYS.DATABASES
WHERE DATABASE_ID > 4 --Exclude sys databases.
AND GETDATE() - CREATE_DATE > 30 --Return databases created more than 30 days ago.
AND NAME LIKE 'CompanyName-HA%[_]%%[99999999]%%[_]%%[A-Z][a-z]%'
AND NAME NOT IN ( --Exclude important databases.
'MyCompany-HA_DBName',
'MyCompany-HA_DBName2'
)) AS ListofDatabases
Select * from #ListofDbsToDrop
I will place drop database loop here.
答案 0 :(得分:1)
您有一个字符串。假设日期之前的部分没有数字,则可以使用以下字符串操作获取日期:
convert(date, left(stuff(name, 1, patindex('%[0-9]%', name) - 1, ''), 8))
然后,您可以直接与dateadd(day, -30, getdate())
之类的内容进行过滤。
如果您的数据库不遵循此模式,请使用try_convert()
:
try_convert(date, left(stuff(name, 1, patindex('%[0-9]%', name) - 1, ''), 8))