Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL select语句正在查找视图中不应存在的内容_Sql_Sql Server - Fatal编程技术网

SQL select语句正在查找视图中不应存在的内容

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

我有这个sql语句用于创建视图

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