我知道这看起来像是重复的,但我还没有看到我正在寻找的答案。
对于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
????
有没有人见过这个?有谁知道我能做些什么呢?
答案 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。