sql-server - 查找表中值无法转换为 int 的行

标签 sql-server casting overflow

我需要一种方法来检测 MSSQL 表中包含无法转换为 int 的 varchar 条目的行。

我正在开发的系统在一个地方使用可编辑的 varchar 字段,并将其连接到另一个地方的整数列。如果 varchar 字段中包含无效数字(空白、带有 alpha 或符号,或者是超过 21 亿的数字(最大 int 大小)),则另一个查询会失败,表示值 xyz 溢出了 int 列,或者可能不被转换。

我想出了以下部分解决方案来查找违规记录:

select g.id, g.membernumber from groups g
left join secondary_groups sg on sg.id=g.id 
where convert(bigint, g.membernumber) > 2147483647 
or isnumeric(g.membernumber) = 0

这对于大多数情况都适用,但后来我意识到,如果您的 varchar 值超过“bigint”,它可能会失败。是否有更通用的方法来定位这些类型的记录,而不是使用强制转换/转换?如果有一个“IsInt()”的内置方法那就太棒了,但是可惜......

最佳答案

从 SQL Server 2012 开始,您可以使用 TRY_CAST当无法执行转换时返回 NULL 的表达式:

select * from table
where TRY_CAST(Value as int) is null

请注意,TRY_CAST 使用与 CAST 相同的转换规则,例如它将空白字符串转换为 0。这在您的情况下不是问题,但在 SQL 外部使用转换结果时应考虑。

还有类似的TRY_CONVERT表达式与 CONVERT 具有相同的语法,但需要将数据库兼容性级别更改为 120 或更高,而 TRY_CAST 也适用于 100。

关于sql-server - 查找表中值无法转换为 int 的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17157781/

相关文章:

带有溢出的 div 的 jquery marquee-like 动画 :hidden and nowrap?

sql-server - 只有系统管理员可以为 RAISERROR 命令指定WITH LOG 选项

sql - 在表的同一列上定义的主键约束和唯一约束

sql-server - 识别 SQL Server 中的连接和 Activity SQL

c++ - 在 C++ 中将 char 数组读取为 float 组,而无需使用 memcpy 复制它

tsql - 将带有逗号分隔符的 nVarChar 转换/转换为十进制

html - 溢出:尽管有绝对和相对,但隐藏不起作用

sql-server - 数据透视表让我发疯,把数字变成日期

c# - 在 WPF 中将 TabItem 转换为 UserControl

c++ - stringstream 在 4GB 处溢出