Sql server SQL Server select在表变量和实际表上的行为不同

Sql server SQL Server select在表变量和实际表上的行为不同,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我有一个表,有两个我关心的字符列,name和value。第二列只有两种类型的字符串,一种是格式字符串,另一种是格式为“/”的字符串。显然,如果不是第二种数据类型,第二列应该是int 根据注释,下面是一个示例表 [name] [value] ABC1 25 ABC2 13/45 ABC3 12/6 ABC4 15 ABC5 89 XYZ1 89 XYZ2 14 XYZ3 52 XYZ4 13 XYZ5 11 返回 [name] [va

我有一个表,有两个我关心的字符列,name和value。第二列只有两种类型的字符串,一种是格式字符串,另一种是格式为“/”的字符串。显然,如果不是第二种数据类型,第二列应该是int

根据注释,下面是一个示例表

[name] [value] ABC1 25 ABC2 13/45 ABC3 12/6 ABC4 15 ABC5 89 XYZ1 89 XYZ2 14 XYZ3 52 XYZ4 13 XYZ5 11 返回

[name] [value] XYZ2 14 XYZ4 13 XYZ5 11 然而,我过于谨慎,宁愿先对表变量执行删除操作,以确保没有忽略任何内容。如果我首先将表中的所有数据插入@tentable,并运行analagous select语句,那么查询将在value='13/45的行失败。将varchar值“13/45”转换为数据类型int时,转换失败


表变量是否会导致SQL Server以不同于标准表的方式对其进行查询?

既然您是2014年的用户,您可以使用TRY\u PARSE。如果某个值无法解析为指定的数据类型,它将返回NULL

select *
from YourTable
where Name like 'XY%'
    and TRY_PARSE([value] as int) < 50

样本数据。。。预期输出。。。您当前的查询。。。任何错误都将有助于在将数据插入到TempTable@MohamedFadhl表变量不使用事务。说到这里,OP-你的问题是什么?它依赖于事务吗?不,它在主表上不起作用。无法将字符串13/45转换为int。无法控制谓词的应用顺序。在主桌上你可能会很幸运,但很可能还有其他事情发生。请参阅下面我关于如何利用TRY_PARSE的回答。这将永远消除这个问题。还有一个问题:虽然这在2014年起作用,但我们仅将2014年用于测试和开发。令人烦恼的是,我们的生产服务器仍在运行2008…是否改为添加一个与“%/%”不同的where子句?
select *
from YourTable
where Name like 'XY%'
    and TRY_PARSE([value] as int) < 50