我有一台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工作得很好。
答案 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
的两面并扔掉第二面。