Eu tenho um relatório de backup que verifica se todos os bancos de dados foram copiados nos últimos 30 dias e quero inserir 'Nem todos os bancos de dados foram copiados nos últimos 30 dias' nesse campo (tipo de data e hora) se for o caso nem todos os bancos de dados foram copiados nos últimos 30 dias, mas recebo o erro Conversion failed when converting date and/or time from character string
.
;WITH CTE AS
(
SELECT
--sdb.Name AS DatabaseName,
MAX(backup_finish_date) AS LastBackUpTime
FROM sys.databases sdb
LEFT OUTER JOIN msdb.dbo.backupset bus ON bus.database_name = sdb.name
WHERE bus.type = 'D'AND bus.database_name NOT IN ('master', 'model', 'msdb', 'tempdb') AND bus.backup_finish_date > DATEADD(day,-30,GETDATE())
AND sdb.Name NOT IN ('DBA')
AND sdb.state_desc = 'ONLINE'
--GROUP BY sdb.Name
)
INSERT INTO Server.Database.Schema.TableName
SELECT @@SERVERNAME as serverName,
--DatabaseName as DatabaseName,
CASE WHEN LastBackupTime IS NULL THEN 'Not all databases backed up in last 30 days' ELSE MIN(LastBackUpTime) END as LastBackUpTime
FROM CTE
GROUP BY LastBackUpTime
O abaixo deve retornar 'Nem todos os bancos de dados com backup' se algum dos bancos de dados não tiver sido copiado e 'Todos os bancos de dados com backup em DD/MM/AAAA' se tiverem (esta será a data de backup mais alta encontrada)
O script procura a data de backup mais alta para todos os bancos de dados que não são do sistema (e não DBA) e retorna o equivalente de data e hora de 0 se não houver nenhum (isso é convertido em
1900-01-01 00:00:00.000
). Podemos então verificar se a data mínima está em nossa região de 30 dias ou não.O problema real que você estava enfrentando era porque sua instrução CASE retornou um tipo de dados DATETIME e um tipo de dados VARCHAR - devido à precedência de tipo de dados para uma instrução CASE O servidor SQL sempre escolherá o tipo de dados de maior precedência como o tipo de dados desse campo - neste caso, era um DATETIME.
Para evitar isso, simplesmente precisamos CAST o campo DATETIME como um VARCHAR, o que impede a conversão implícita de VARCHAR para DATETIME (precedência menor para maior)