SQL select语句正在查找视图中不应存在的内容
我有这个sql语句用于创建视图SQL select语句正在查找视图中不应存在的内容,sql,sql-server,Sql,Sql Server,我有这个sql语句用于创建视图 create view RecordYearsTwo as select Record.RecordID, RecordValue.Value from Record join RecordValue on Record.RecordID = RecordValue.RecordID where len(RecordValue.Value) = 4
create view RecordYearsTwo
as
select
Record.RecordID, RecordValue.Value
from
Record
join
RecordValue on Record.RecordID = RecordValue.RecordID
where
len(RecordValue.Value) = 4
and RecordValue.Value like '[16-20][0-9][0-9][0-9]%'
and RecordValue.Value like '%[16-20][0-9][0-9][0-9]'
and RecordValue.Value != '26 Mar 1850';
当我跑的时候
select *
from Record
join RecordYearsTwo on Record.RecordID = RecordYearsTwo.RecordID
where cast(RecordYearsTwo.Value as int) >= 1800
我得到这个错误
将nvarchar值“1850年3月26日”转换为数据类型int时,转换失败
我的理解是,‘1850年3月26日’在我看来根本不应该存在,因为我认为所有事物的长度都应该是4,我特别说过不应该等于‘1850年3月26日’
有什么想法吗?where子句中有多个表达式,您无法保证它们的执行顺序。尝试:
create view RecordYearsTwo as
select r.RecordID, v.Value
from Record r
join (
select *
from RecordValue
where len(Value) = 4
) v on r.RecordID = v.RecordID
where v.Value like '[16-20][0-9][0-9][0-9]%'
and v.Value like '%[16-20][0-9][0-9][0-9]'
不需要该邮戳的标准。
因为即使是第一个标准也不会接受它(太长) 如果只需要4个字符,那么那些类似条件的条件不需要%s
create view RecordYearsTwo as
select rec.RecordID, val.Value
from Record rec
join RecordValue val on val.RecordID = rec.RecordID
where len(val.Value) = 4
and (val.Value like '1[6-9][0-9][0-9]' or val.Value like '20[0-9][0-9]')
为了避免错误,您可以使用
select *
from Record
join RecordYearsTwo on Record.RecordID = RecordYearsTwo.RecordID
where try_cast(RecordYearsTwo.Value as int) >= 1800
首先,您的视图条件没有意义。我想你想要:
create view RecordYearsTwo as
select r.RecordID, rv.Value
from Record r join
RecordValue rv
on r.RecordID = rv.RecordID
where len(rv.Value) = 4
try_convert(int, rv.Value) >= 1600 and
try_convert(int, rv.Value) < 2100;
是否确实删除了视图,然后重新创建了它?旁注:最好以可搜索的格式存储日期,最好是ISO:
YYYY-MM-DD
(因此,'1850-03-26
,假设您不能将其存储为日期对象)。这将使您甚至不需要执行转换等操作。SQL Server可以决定将where子句合并在一起。寻求调试帮助的问题(“为什么此代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现该问题所需的最短代码。在这种情况下,问题是缺少表格定义。例如,如果RecordValue.Value
的类型为int
,则可能会导致此错误。请提供一份报告。
select *
from Record join r
RecordYearsTwo ry2
on r.RecordID = ry2.RecordID
where try_convert(int, ry2.Value) >= 1800