2014-07-15 67 views
0

我知道這看起來像重複,但我沒有看到我正在查找的答案。SQL Server從VARCHAR中提取INT

我有一個ID列,是VARCHAR(36)的ID令牌。在遺留系統中,這些令牌只有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 

????

有沒有人見過這個?任何人都知道我能做些什麼嗎?

+1

轉換爲bigint或decimal。 –

+1

將您的int更改爲很長時間以解決您的第一個問題。此外,請嘗試:SELECT 1 WHERE 11122241333 <2147483647.這就是SQL設計的工作方式,在字符串比較2> 1中,因此返回1. – RandomUs1r

+0

答案在上面...對當前行爲的解釋...查看列表go 1,10,11,2,20,3,4,5,6等..?這是varchar數字排序的方式。 – Twelfth

回答

2

如果您想要進行「僞數字」比較,您可以嘗試「LPAD」您的字符串(我選擇20作爲最大長度,當然這是任意的)。

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

第一個示例拋出:將數據類型varchar轉換爲bigint時出錯。 第二個例子是一種享受。謝謝!此外,我以前沒有看到複製品。很高興知道這一點。 –

+0

@AndrewMartin thx反饋,我刪除第一個例子。 –

1

如果你有SQL Server 2012或更高版本,那麼你可以使用try_parse()

SELECT TOP 100000 try_parse(CustomerToken as int) AS CustomerToken 

如果該值無法被轉換,那麼該函數將返回一個空標記,否則它將返回一個int值。