2014-12-31 1 views
0

행성에있는 모든 SIM 카드의 고유 코드 인 ICCID의 유효 숫자를 검증 할 수 있는지 궁금합니다.TSQL에서 SIM 카드의 ICCID 번호를 확인하는 방법은 무엇입니까?

T-SQL 함수에서 유효한지 검사 할 사람이 있습니까?

데이터베이스에서 프로그래밍 언어를 사용하지 않고도이 작업을 수행하고 싶습니다.


나는 C에 #이 코드를 찾았지만 난 그냥 수학 및 C#에서 형편이 << 운영자가 날 종료하기 때문에 SQL로 변환 할 unnable이다!

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) 스택 오버 플로우 문서에서는 TSQL에 # C에서 비트 변화를 변환 할 항목이 있어야합니다. 이 코드를 TSQL로 변환하는 대신 .NET 코드 (성능이 더 좋을 수 있음)를 사용하기 위해 잠재적으로 SQL CLR 기능을 사용할 수도 있습니다.

관련 문제