2015-05-08 2 views
1

Я пытаюсь преобразовать это в использование инструкции CASE вместо инструкции IF, но я получаю «неправильный синтаксис около Set».Анализ значения IPv4 с использованием оператора CASE

Его на первом SET:

WHEN 1 THEN 
    SET @firstOctet = CAST(SUBSTRING(@WorkingNullRouteIP, 1, @lastOctet - 1)) 


    DECLARE @lastOctet    int, 
      @octetCount    int, 
      @firstOctet    int = -1, 
      @secondOctet   int = -1, 
      @thirdOctet    int = -1, 
      @fourthOctet   int = -1 
    DECLARE @WorkingNullRouteIP  varchar(50) 

    SET @WorkingNullRouteIP = @a_NullRouteIP 

    WHILE (CHARINDEX('.',@WorkingNullRouteIP, @lastOctet) > 0) 
     BEGIN 
     SET @lastOctet = CHARINDEX('.',@WorkingNullRouteIP, @lastOctet) 
     SET @octetCount = @octetCount + 1 

     If @octetCount = 1 
      BEGIN 
       SET @firstOctet = CAST(SUBSTRING(@WorkingNullRouteIP, 1, @lastOctet - 1)) 
      END 

     If @octetCount = 2 
      BEGIN 
      SET @secondOctet = CAST(SUBSTRING(@WorkingNullRouteIP, 1, @lastOctet - 1)) 
      END 

     If @octetCount = 3 
      BEGIN 
      SET @thirdOctet = CAST(SUBSTRING(@WorkingNullRouteIP, 1, @lastOctet - 1)) 
      END         

     SET @WorkingNullRouteIP = SUBSTRING(@WorkingNullRouteIP, @lastOctet + 1) 
     SET @lastOctet = 1 
     END  

    -- Converting to this:  

    WHILE (CHARINDEX('.',@WorkingNullRouteIP, @lastOctet) > 0) 
    BEGIN 
     SET @lastOctet = CHARINDEX('.',@WorkingNullRouteIP, @lastOctet) 
     SET @octetCount = @octetCount + 1 

     SELECT CASE @octetCount 
      WHEN 1 THEN 
        SET @firstOctet = CAST(SUBSTRING(@WorkingNullRouteIP, 1, @lastOctet - 1)) 
      WHEN 2 THEN 
        SET @secondOctet = CAST(SUBSTRING(@WorkingNullRouteIP, 1, @lastOctet - 1)) 
      WHEN 3 THEN 
        SET @thirdOctet = CAST(SUBSTRING(@WorkingNullRouteIP, 1, @lastOctet - 1))           
     END 

     SET @WorkingNullRouteIP = SUBSTRING(@WorkingNullRouteIP, @lastOctet + 1) 
     SET @lastOctet = 1 
    END 
+0

Это выглядит, как вы пытаетесь сломать IP-адрес в 4 октета? Вы посмотрели на PARSENAME? –

+0

Оператор case может возвращать только значение, он не может управлять потоком, поэтому он не может содержать команды типа SET. –

+0

@TabAlleman: Чтобы уточнить - оператор CASE * действительно является выражением CASE *, с соответствующими ограничениями. –

ответ

4

Почему бы просто не использовать функцию PARSENAME, как описано here

DECLARE @WorkingNullRouteIP  varchar(50) = '192.168.100.1'; 
DECLARE @firstOctet    int = PARSENAME(@WorkingNullRouteIP,4), 
     @secondOctet   int = PARSENAME(@WorkingNullRouteIP,3), 
     @thirdOctet    int = PARSENAME(@WorkingNullRouteIP,2), 
     @fourthOctet   int = PARSENAME(@WorkingNullRouteIP,1); 

select 
    @firstOctet 
    ,@secondOctet 
    ,@thirdOctet 
    ,@fourthOctet; 

дать

----------- ----------- ----------- ----------- 
192   168   100   1 
+0

Работы..После коррекции ... спасибо. – user3020047

Смежные вопросы