2014-12-31 39 views
0

我一直在想,是否有可能驗證這個大數字是ICCID上每個SIM卡的唯一代碼。如何在TSQL中驗證SIM卡的ICCID號碼?

如果有,是否有人有代碼來檢查它是否對T-SQL函數有效?

我想這樣做,而不需要任何編程語言的數據庫。


我發現C#的代碼,但我unnable將其轉換爲SQL,因爲我只是吮吸數學和C#這<<運營商剛剛結束我!

private bool IccidIsValid(string iccid) 
{ 
    try 
    { 
     int numberStringLength = 18; 

     int cs = 0; 
     int dodd; 
     for (int i = 0; i < numberStringLength; i += 2) 
     { 
      dodd = Convert.ToInt32(iccid.Substring(i + 1, 1)) << 1; 
      cs += Convert.ToInt32(iccid.Substring(i, 1)) + (int)(dodd/10) + (dodd % 10); 
     } 
     cs = (10-(cs % 10)) % 10; 

     if (cs == Convert.ToInt32(iccid.Substring(numberStringLength, 1))) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
    catch (Exception ex) 
    { 
     return false; 
    } 
} 
+0

是什麼的ICCID是什麼樣子?並不是每個人都知道,那些知道T-SQL的人很可能不知道。 –

+0

https://theiphonewiki.com/wiki/ICCID – PSyLoCKe

+0

我不同意這種觀點,因爲TSQL是一個TI職業問題,而ICCID是電信行業的一個專業問題,TI專業人士在爲電信公司開發時可能不得不面對這些問題。 ......這就像是說程序員可能永遠不知道銀行業務(但是所有的銀行軟件都是由程序員製作的) – PSyLoCKe

回答

0

我找到了!

CREATE FUNCTION dbo.usp_ValidateICCID (@inputString VARCHAR(20)) 
RETURNS TINYINT 
AS BEGIN 

DECLARE @result TINYINT 

IF @inputString NOT LIKE ('%[0-9]%[0-9]%[0-9]%') 
RETURN 2 

DECLARE @charTable TABLE ( 
Position INT NOT NULL, 
ThisChar CHAR(1) NOT NULL, 
Doubled TINYINT, 
Summed TINYINT) 

SET @inputString = CAST(@inputString AS CHAR(20)) 
INSERT INTO @charTable(Position, ThisChar) 
SELECT 1, SUBSTRING(@inputString, 1, 1) UNION ALL 
SELECT 2, SUBSTRING(@inputString, 2, 1) UNION ALL 
SELECT 3, SUBSTRING(@inputString, 3, 1) UNION ALL 
SELECT 4, SUBSTRING(@inputString, 4, 1) UNION ALL 
SELECT 5, SUBSTRING(@inputString, 5, 1) UNION ALL 
SELECT 6, SUBSTRING(@inputString, 6, 1) UNION ALL 
SELECT 7, SUBSTRING(@inputString, 7, 1) UNION ALL 
SELECT 8, SUBSTRING(@inputString, 8, 1) UNION ALL 
SELECT 9, SUBSTRING(@inputString, 9, 1) UNION ALL 
SELECT 10, SUBSTRING(@inputString, 10, 1) UNION ALL 
SELECT 11, SUBSTRING(@inputString, 11, 1) UNION ALL 
SELECT 12, SUBSTRING(@inputString, 12, 1) UNION ALL 
SELECT 13, SUBSTRING(@inputString, 13, 1) UNION ALL 
SELECT 14, SUBSTRING(@inputString, 14, 1) UNION ALL 
SELECT 15, SUBSTRING(@inputString, 15, 1) UNION ALL 
SELECT 16, SUBSTRING(@inputString, 16, 1) UNION ALL 
SELECT 17, SUBSTRING(@inputString, 17, 1) UNION ALL 
SELECT 18, SUBSTRING(@inputString, 18, 1) UNION ALL 
SELECT 19, SUBSTRING(@inputString, 19, 1) UNION ALL 
SELECT 20, SUBSTRING(@inputString, 20, 1) 

DELETE FROM @charTable 
WHERE ThisChar NOT LIKE('[0-9]') 

DECLARE @tempTable TABLE ( 
NewPosition INT IDENTITY(1,1), 
OldPosition INT) 
INSERT INTO @tempTable (OldPosition) 
SELECT Position 
FROM @charTable 
ORDER BY Position ASC 

UPDATE @charTable 
SET Position = t2.NewPosition 
FROM @charTable t1 
INNER JOIN @tempTable t2 ON t1.Position = t2.OldPosition 

IF (SELECT MAX(Position) % 2 FROM @charTable) = 0 
BEGIN 
UPDATE @charTable 
SET Doubled = CAST(ThisChar AS TINYINT) * 2 
WHERE Position % 2 <> 0 
END 
ELSE BEGIN 
UPDATE @charTable 
SET Doubled = CAST(ThisChar AS TINYINT) * 2 
WHERE Position % 2 = 0 
END 


UPDATE @charTable 
SET Summed = 
    CASE WHEN Doubled IS NULL 
    THEN CAST(ThisChar AS TINYINT) 
    WHEN Doubled IS NOT NULL AND Doubled <= 9 
    THEN Doubled 
    WHEN Doubled IS NOT NULL AND Doubled >= 10 
    THEN (Doubled/10) + (Doubled - 10) 
    END  


IF (SELECT SUM(Summed) % 10 FROM @charTable) = 0 
SET @result = 1 
ELSE 
SET @result = 0 

RETURN @result 

END 

我只是重拍的網絡版,使之無需臨時表的速度更快:

alter function dbo.usp_ValidaICCID(@inputStr varchar(20)) 
    RETURNS tinyint 
as begin 
    declare @workStr varchar(20) 
    declare @strLength smallint 
    declare @i   smallint 
    declare @sum  smallint 
    declare @prod  smallint 
    declare @digit  char(1) 
    declare @evenInd tinyint 
    declare @result tinyint 
    if(@inputStr not LIKE ('%[0-9]%[0-9]%[0-9]%[0-9]%[0-9]%[0-9]%[0-9]%[0-9]%[0-9]%[0-9]%[0-9]%[0-9]%[0-9]%[0-9]%[0-9]%[0-9]%[0-9]%[0-9]')) 
     return 2 
    set @strLength = len (@inputStr) 
    set @i = 1 
    set @workStr = '' 
    WHILE @i <= @strLength 
    BEGIN 
    set @digit = SUBSTRING(@inputStr, @i, 1) 
    if(@digit LIKE '[0-9]') set @workStr = @workStr + @digit 
    set @i = @i +1 
    end 
    set @sum  = 0 
    set @evenInd = 0 
    if(@strLength % 2 = 0) 
    set @evenInd = 1 
    set @i = 1 
    WHILE @i <= @strLength 
    BEGIN 
    set @digit = SUBSTRING(@workStr, @i, 1) 
    set @prod = CONVERT(smallint , @digit) 
    if(@evenInd = 1 and @i % 2 = 1 or @evenInd = 0 and @i % 2 = 0) set @prod = @prod * 2 
    if(@prod >= 10) set @prod = @prod/10 + @prod-10 
    set @sum = @sum + @prod 
    set @i = @i +1 
    END 
    if(@sum %10 = 0) 
    set @result = 1 
    else 
    set @result = 0 
    return @result 
end  
1

這(Bitshift operations in T-SQL)棧溢出的文章應該有你需要的位移位從C#轉換爲TSQL什麼。您也可以使用SQL CLR功能來使用您的.NET代碼(這可能更具性能),而不是將其轉換爲TSQL。

相關問題