SQL Server从VARCHAR中提取INT

时间:2014-07-15 20:53:09

标签: sql sql-server

我知道这看起来像是重复的,但我还没有看到我正在寻找的答案。

对于ID令牌,我有一个ID列为VARCHAR(36)。在遗留系统中,这些令牌仅为INT。现在它们都混淆了,我需要能够仅为某些操作提取整数标记,并且它们必须转换为INT。

我以为我可以这样做:

select top 100000 convert(int,CustomerToken) as CustomerToken
from Customer
WHERE (CustomerToken NOT LIKE '%[^-+ 0-9]%' AND CustomerToken < '214783647')

但是有一些我不想要的数值。但是一些数值会产生问题。我得到错误varchar值'11122241333'溢出一个int列。

这对我来说似乎很奇怪。这似乎更奇怪:

SELECT 1 WHERE '11122241333' < '2147483647'

1

????

有没有人见过这个?有谁知道我能做些什么呢?

2 个答案:

答案 0 :(得分:2)

您可以尝试&#34; LPAD&#34;你的字符串(我选择20作为最大长度,当然是任意的),如果你想要一个&#34;伪数字&#34;比较。

select top 10000 convert(int, CustomerToken) as CustomerToken
from Customer
WHERE (CustomerToken NOT LIKE '%[^-+ 0-9]%' 
AND replicate('0', 20- len(CustomerToken)) + CustomerToken < '0000000000214783647')

答案 1 :(得分:1)

如果您有SQL Server 2012或更高版本,则可以使用try_parse()

SELECT TOP 100000 try_parse( CustomerToken as int ) AS CustomerToken

如果无法转换值,则函数将返回空标记,否则返回int。