使用 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
的两边并丢弃第二个。
我有一个 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
的两边并丢弃第二个。