Sql 从VARCHAR到INT的转换失败
我正在尝试使用SQL获取基于现有策略编号的新策略编号。我不想使用update,因为我不想永久更改记录 我的保单编号类似于PFA991228-01,我想使用SQL修改并获取PFA991228-02。所以我只是更新最后两位数字,从00到01或从05到06等等。现在我得到了将varchar转换为int的错误 我是SQL新手,所以不确定是否可以在第一个select语句中实现它,而不是使用子查询Sql 从VARCHAR到INT的转换失败,sql,sql-server,Sql,Sql Server,我正在尝试使用SQL获取基于现有策略编号的新策略编号。我不想使用update,因为我不想永久更改记录 我的保单编号类似于PFA991228-01,我想使用SQL修改并获取PFA991228-02。所以我只是更新最后两位数字,从00到01或从05到06等等。现在我得到了将varchar转换为int的错误 我是SQL新手,所以不确定是否可以在第一个select语句中实现它,而不是使用子查询 select left(p.policynum, 9) + '-' + right('00' + con
select
left(p.policynum, 9)
+ '-'
+ right('00' + convert(varchar(255), right(p.policynum, 2) + 1), 2) as newPolicy
From Company55.dbo.policy p
where p.policynum not like '%S%'
我想提出这样的逻辑:
select (left(p.policynum, 9) + '-' +
right( '00' + try_convert(int, right(p.policynum, 2)) + 1 as varchar(255)), 2) as newPolicy
From Company55.dbo.policy P
where p.policynum not like '%S%' and
p.policynum like '%[0-9][0-9]';
注:
where确保输出行都以两位数结尾。
try_convert确保到整数的转换成功-where不够。
这适用于1位和2位后缀。
我看不出子查询的理由。例如,2实际上并不比术语复杂多少。
尝试仅执行子选择,并查看是否存在无法转换为INT的“Term”值。潜在的add…此逻辑取决于9位数的策略号。如果它们较长/较短,则需要使用patindex来检测“-”的位置,然后从该位置使用left。leftp.policynum,patindexp.policynum,'-'-1…我想这是对的…我的括号可能已经掉了。谢谢我用你的括号修改了我当前的代码并得到了想要的结果。