Sql 将输入的非数值设置为null

Sql 将输入的非数值设置为null,sql,sql-server,sql-convert,Sql,Sql Server,Sql Convert,我有一个paymentHistory字段,它是一个int,用于跟踪以前从该帐户支付的金额。我有一个来源是这个字段的varchar,有人在前端意外地进入了1.11。我无法更改我的源代码,但我希望能够只允许数值,并将非数值转换为空值。有人能举例说明我如何将PaymentHistory列中的值仅转换为数字或null。谢谢 您可以使用检查约束拒绝非数值: alter table chk_paymenthistory add constraint chk_paymenthistory_num ch

我有一个paymentHistory字段,它是一个int,用于跟踪以前从该帐户支付的金额。我有一个来源是这个字段的varchar,有人在前端意外地进入了1.11。我无法更改我的源代码,但我希望能够只允许数值,并将非数值转换为空值。有人能举例说明我如何将PaymentHistory列中的值仅转换为数字或null。谢谢

您可以使用
检查
约束拒绝非数值:

alter table chk_paymenthistory add constraint chk_paymenthistory_num
    check (num not like '%[^0-9]%');
这只允许数字进入列。但您不希望拒绝该值,而是希望将其替换为
NULL

如果使用
insert
插入行,则可以使用
try\u cast()
/
try\u convert()

这将把值转换为整数(您可以使用
bigint
numeric
)。然后它将被保存为一个字符串——但如果它不是一个有效的数字,它将是
null


这就给你留下了其他情况的导火索。但还有什么情况?我想到的是
批量插入
,但默认情况下不会调用触发器。你可以打开它们,如果您需要此功能。

请显示一些示例数据和使用的更新查询。但是
1.11
是一个数值…@larnu我指的是一个int。我希望它只与int兼容,因为我的目标是一个int,并且它无法插入我的targetSo 1.11应该变为null而不是1?考虑到
varchar
这一点表示无法转换为
int
decimal
TRY\u CONVERT
也是一个选项。但是,在
插入时停止坏数据并拒绝它仍然是一个更好的计划。
insert into paymenthistory ( . . . )
    values ( . . ., try_cast(num as int), . . .);