SQL Server select对表变量的行为与实际表的行为不同

时间:2017-09-26 15:55:40

标签: sql-server sql-server-2008

我有一张包含两个我关心的字符列的表,namevalue。第二列只有两种类型的字符串,即'######'形式的字符串和'##### / #####'形式的字符串。显然,如果不是第二种数据类型,第二列应该是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包含'XY' value小于50的表格中删除所有行。要确定我需要删除哪些行,我可以运行

SELECT * FROM table WHERE name LIKE 'XY%' AND CONVERT(int,value)<50

返回

[name]  [value]
XYZ2    14
XYZ4    13
XYZ5    11

但是,我过于谨慎,并且首先要对表变量执行删除操作,以确保我没有忽略任何内容。如果我首先将表中的所有数据插入@TempTable,并运行analagous select语句,则查询将在value = '13/45的行上失败。 Conversion failed when converting the varchar value '13/45' to data type int.

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

1 个答案:

答案 0 :(得分:1)

自2014年起,您可以使用TRY_PARSE。如果无法将值解析为指定的数据类型,则它将返回NULL。

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