转换使用TOP和WHERE将Varchar转换为日期

时间:2015-02-25 22:07:59

标签: sql-server tsql sql-server-2012

我有一台MSSQL 2012服务器,它可以存放我的ERP的日常数据库(日复一日)。简单JOB从我的备份服务器恢复最新的数据库,并删除最旧的数据库。它工作正常几个月,但一周前它开始失败。其中一个查询返回:'转换从字符串转换日期和/或时间时失败。'

所有数据库都具有相同的名称架构' DATABASE_date'例如:' DATABASE_20150224'。

这是查询:

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

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

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

似乎MSSQL检查此服务器上的所有数据库(另一个应用程序的2个新数据库)。但为什么?那里有一个' WHERE' cluase和simple select工作得很好。

2 个答案:

答案 0 :(得分:2)

你可以替换

order by CAST(right(name,8) as DATE)

order by TRY_CAST(RIGHT(name, 8) AS DATE)

答案 1 :(得分:1)

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

您正在转发where子句以过滤掉会导致字符串操作表达式异常的行。但是SQL Server可以在where之后运行order by

一种方法是防范order by

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

请注意,即使这不是100%保证可以正常工作。 SQL Server可以合法地评估case的两面并扔掉第二面。