使用 TOP 和 WHERE 转换失败的 Varchar

Conversion Failed Varchar to Date with TOP and WHERE

我有一个 MSSQL 2012 服务器,其中包含我的 ERP 的旧数据库(每天)。 Simple JOB 从我的备份服务器恢复最新的数据库并删除最旧的数据库。几个月来它运行良好,但一周前它开始出现故障。查询之一 returns:'Conversion failed when converting date and/or time from character string.'

所有数据库的名称都具有相同的模式'DATABASE_date',例如:'DATABASE_20150224'。

这是查询:

SELECT TOP 1 name 
from sys.databases 
where name like 'DataBaseName_%' 
order by CAST(right(name,8) as DATE)

如果我删除 'TOP 1' 它工作正常。

SELECT name 
from sys.databases 
where name like 'DataBaseName_%' 
order by CAST(right(name,8) as DATE)

似乎 MSSQL 检查了此服务器上的所有数据库(不同应用程序的 2 个新数据库)。但为什么?有一个 'WHERE' 条款,简单的 select 就可以了。

SQL 是一种声明性语言。数据库可以自由地先对行进行排序然后过滤它们,或者反过来。

您正在依赖 where 子句来过滤掉会导致字符串操作表达式出现异常的行。但是SQL服务器可以在order by.

之后运行where

一种方法是防弹 order by:

order by 
        case
        when name not like 'DataBaseName_%' then name
        else CAST(right(name,8) as DATE)
        end

请注意,即使这样也不能 100% 保证有效。 SQL 服务器可以合法地评估 case 的两边并丢弃第二个。