select max(cast(substring(cname, 4 , len(cname)) as int)) from t
这个可以,怎么去掉转换出错的行 有的输错了 ab1234aa ab1234bb
将 nvarchar 值 'aa' 转换为数据类型为 int 的列时发生语法错误。
--测试数据 if not object_id(N'Tempdb..#T') is null drop table #T Go Create table #T([cname] nvarchar(28)) Insert #T select N'ab1234bb' union all select N'ab1235bb' union all select N'ab1233' union all select N'ab2233' Go --测试数据结束 SELECT SUBSTRING([cname], PATINDEX('%[^0-9][0-9]%', [cname]) + 1, CASE WHEN PATINDEX('%[0-9][^0-9]%', [cname]) = 0 THEN LEN(cname) ELSE PATINDEX('%[0-9][^0-9]%', [cname]) END - PATINDEX('%[^0-9][0-9]%', [cname])) AS ID FROM #T ORDER BY SUBSTRING([cname], PATINDEX('%[^0-9][0-9]%', [cname]) + 1, CASE WHEN PATINDEX('%[0-9][^0-9]%', [cname]) = 0 THEN LEN(cname) ELSE PATINDEX('%[0-9][^0-9]%', [cname]) END - PATINDEX('%[^0-9][0-9]%', [cname])) DESC
from t
有的输错了 ab1234aa ab1234bb
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([cname] nvarchar(28))
Insert #T
select N'ab1234bb' union all
select N'ab1235bb' union all
select N'ab1233' union all
select N'ab2233'
Go
--测试数据结束
SELECT SUBSTRING([cname], PATINDEX('%[^0-9][0-9]%', [cname]) + 1,
CASE WHEN PATINDEX('%[0-9][^0-9]%', [cname]) = 0
THEN LEN(cname)
ELSE PATINDEX('%[0-9][^0-9]%', [cname])
END - PATINDEX('%[^0-9][0-9]%', [cname])) AS ID
FROM #T
ORDER BY SUBSTRING([cname], PATINDEX('%[^0-9][0-9]%', [cname]) + 1,
CASE WHEN PATINDEX('%[0-9][^0-9]%', [cname]) = 0
THEN LEN(cname)
ELSE PATINDEX('%[0-9][^0-9]%', [cname])
END - PATINDEX('%[^0-9][0-9]%', [cname])) DESC