| 
					
							
        
    
        
						
			 | 
			
			
					    
					
        
         
          
         
	
            | SP og replace noget af en IP adresse Fra : Joe | 
  Dato :  21-02-11 07:04 |  
  |   
            Hvis jeg har følgende i min Stored Procedure:
 
 @ipseg = '1.2.'
 @ipaddr = '1.7.8.9'
 
 Hvordan får jeg så nemmest @ipaddr til at være '1.2.8.9' ? Bemærk at
 det jo også kan være '1.' eller '1.2.3.' i IP segmentet.
 
 Jeg er ude i noget virkeligt snavs (cirka 100 linie kode) og det
 virker stadigt ikke, så jeg smider håndklædet i ringen og vil meget
 gerne have input fra eksperterne.
 
 Hvis det er relevant er det en SQL2000.
  
            
             |   |   
            
        
 
            
         
           Arne Vajhøj (22-02-2011) 
         
	
            | Kommentar Fra : Arne Vajhøj | 
  Dato :  22-02-11 04:41 |  
  |   
            On 21-02-2011 09:04, Joe wrote:
 > Hvis jeg har følgende i min Stored Procedure:
 >
 > @ipseg = '1.2.'
 > @ipaddr = '1.7.8.9'
 >
 > Hvordan får jeg så nemmest @ipaddr til at være '1.2.8.9' ? Bemærk at
 > det jo også kan være '1.' eller '1.2.3.' i IP segmentet.
 >
 > Jeg er ude i noget virkeligt snavs (cirka 100 linie kode) og det
 > virker stadigt ikke, så jeg smider håndklædet i ringen og vil meget
 > gerne have input fra eksperterne.
 
 Mit forslag:
 
 CREATE FUNCTION ippart(@ip VARCHAR(16), @n INTEGER) RETURNS VARCHAR(16)
 AS
 BEGIN
      DECLARE @ix INTEGER
      DECLARE @newix INTEGER
      DECLARE @s VARCHAR(4)
      DECLARE @i INTEGER
      SET @ix = 1
      SET @i = 0
      WHILE @i < @n
      BEGIN
          IF @ix <= LEN(@ip)
          BEGIN
              SET @newix = CHARINDEX('.', @ip, @ix)
              IF @newix = 0 SET @newix = LEN(@ip) + 1
              SET @s = SUBSTRING(@ip, @ix, @newix-@ix)
              SET @ix = @newix + 1
          END
          ELSE
              SET @s = ''
          SET @i = @i + 1
      END
      IF @s = '' SET @s = NULL
      RETURN @s
 END
 GO
 
 CREATE FUNCTION iprepl(@ipaddr VARCHAR(16), @ipseg VARCHAR(16)) RETURNS 
 VARCHAR(16)
 AS
 BEGIN
      DECLARE @ipaddr_1 VARCHAR(16)
      DECLARE @ipaddr_2 VARCHAR(16)
      DECLARE @ipaddr_3 VARCHAR(16)
      DECLARE @ipaddr_4 VARCHAR(16)
      DECLARE @ipseg_1 VARCHAR(16)
      DECLARE @ipseg_2 VARCHAR(16)
      DECLARE @ipseg_3 VARCHAR(16)
      DECLARE @ipseg_4 VARCHAR(16)
      SET @ipaddr_1 = dbo.ippart(@ipaddr, 1)
      SET @ipaddr_2 = dbo.ippart(@ipaddr, 2)
      SET @ipaddr_3 = dbo.ippart(@ipaddr, 3)
      SET @ipaddr_4 = dbo.ippart(@ipaddr, 4)
      SET @ipseg_1 = dbo.ippart(@ipseg, 1)
      SET @ipseg_2 = dbo.ippart(@ipseg, 2)
      SET @ipseg_3 = dbo.ippart(@ipseg, 3)
      SET @ipseg_4 = dbo.ippart(@ipseg, 4)
      RETURN COALESCE(@ipseg_1, @ipaddr_1) + '.' + COALESCE(@ipseg_2, 
 @ipaddr_2) + '.' + COALESCE(@ipseg_3, @ipaddr_3) + '.' + 
 COALESCE(@ipseg_4, @ipaddr_4)
 END
 GO
 
 > Hvis det er relevant er det en SQL2000.
 
 Det er det.
 
 Det var 10 gange nemmere i 2005/2008, hvor man
 kunne lave en CLR UDF.
 
 Arne
  
            
             |   |   
            
        
 
            
         
           Joe (21-02-2011) 
         
	
            | Kommentar Fra : Joe | 
  Dato :  21-02-11 23:49 |  
  |   
            > > @ipseg = '1.2.'
 > > @ipaddr = '1.7.8.9'
 >
 > > Hvordan f r jeg s nemmest @ipaddr til at v re '1.2.8.9' ? Bem rk at
 > > det jo ogs kan v re '1.' eller '1.2.3.' i IP segmentet.
 >
 > > Jeg er ude i noget virkeligt snavs (cirka 100 linie kode) og det
 > > virker stadigt ikke, s jeg smider h ndkl det i ringen og vil meget
 > > gerne have input fra eksperterne.
 >
 > Mit forslag:
 > CREATE FUNCTION ippart(@ip VARCHAR(16), @n INTEGER) RETURNS VARCHAR(16)
 > CREATE FUNCTION iprepl(@ipaddr VARCHAR(16), @ipseg VARCHAR(16)) RETURNS
 
 Mange tak Arne - det fungere rigtigt godt.
  
            
             |   |   
            
        
 
            
         
           Leif Neland (24-02-2011) 
         
	
            | Kommentar Fra : Leif Neland | 
  Dato :  24-02-11 12:40 |  
  |  
 
            Joe wrote:
 >>> @ipseg = '1.2.'
 >>> @ipaddr = '1.7.8.9'
 >>
 >>> Hvordan f r jeg s nemmest @ipaddr til at v re '1.2.8.9' ? Bem rk at
 >>> det jo ogs kan v re '1.' eller '1.2.3.' i IP segmentet.
 >>
 >>> Jeg er ude i noget virkeligt snavs (cirka 100 linie kode) og det
 >>> virker stadigt ikke, s jeg smider h ndkl det i ringen og vil meget
 >>> gerne have input fra eksperterne.
 >>
 >> Mit forslag:
 >> CREATE FUNCTION ippart(@ip VARCHAR(16), @n INTEGER) RETURNS
 >> VARCHAR(16) CREATE FUNCTION iprepl(@ipaddr VARCHAR(16), @ipseg
 >> VARCHAR(16)) RETURNS
 >
 > Mange tak Arne - det fungere rigtigt godt.
 Indtil en dag, ipadressen er 2a00:1450:400c:c00::63; google.com's 
 ipv6-adresse.
 Men hellere vente et par år med det, så kan du tjene fede overarbejdspenge 
 på at rette det, når der går ipv6-panik i den, ligesom med 
 Y2K-problematikken   
Leif 
            
              |   |   
            
        
 
            
         
            Chano Andersen (25-02-2011) 
         
	
            | Kommentar Fra : Chano Andersen | 
  Dato :  25-02-11 00:31 |  
  |  
 
            Den 24-02-2011 12:39, Leif Neland skrev:
 > Joe wrote:
 >>>> @ipseg = '1.2.'
 >>>> @ipaddr = '1.7.8.9'
 >>>
 >>>> Hvordan f r jeg s nemmest @ipaddr til at v re '1.2.8.9' ? Bem rk at
 >>>> det jo ogs kan v re '1.' eller '1.2.3.' i IP segmentet.
 >>>
 >>>> Jeg er ude i noget virkeligt snavs (cirka 100 linie kode) og det
 >>>> virker stadigt ikke, s jeg smider h ndkl det i ringen og vil meget
 >>>> gerne have input fra eksperterne.
 >>>
 >>> Mit forslag:
 >>> CREATE FUNCTION ippart(@ip VARCHAR(16), @n INTEGER) RETURNS
 >>> VARCHAR(16) CREATE FUNCTION iprepl(@ipaddr VARCHAR(16), @ipseg
 >>> VARCHAR(16)) RETURNS
 >>
 >> Mange tak Arne - det fungere rigtigt godt.
 >
 > Indtil en dag, ipadressen er 2a00:1450:400c:c00::63; google.com's
 > ipv6-adresse.
 >
 > Men hellere vente et par år med det, så kan du tjene fede overarbejdspenge
 > på at rette det, når der går ipv6-panik i den, ligesom med
 > Y2K-problematikken   
Heh.. Jeg er faktisk begyndt at tage hensyn til IPv6 i arbejdsmæssig 
 sammenhæng. Alt andet kan ikke betale sig, så alle IP felter får f.eks. 
 plads til 45 tegn, hvilket passer med IPv6 adresser også med 0000::ipv4 
 adresse formatet.
 - Chano Andersen
            
              |   |   
            
        
 
            
         
            Arne Vajhøj (26-02-2011) 
         
	
            | Kommentar Fra : Arne Vajhøj | 
  Dato :  26-02-11 01:42 |  
  |  
 
            On 24-02-2011 06:39, Leif Neland wrote:
 > Joe wrote:
 >>>> @ipseg = '1.2.'
 >>>> @ipaddr = '1.7.8.9'
 >>>
 >>>> Hvordan f r jeg s nemmest @ipaddr til at v re '1.2.8.9' ? Bem rk at
 >>>> det jo ogs kan v re '1.' eller '1.2.3.' i IP segmentet.
 >>>
 >>>> Jeg er ude i noget virkeligt snavs (cirka 100 linie kode) og det
 >>>> virker stadigt ikke, s jeg smider h ndkl det i ringen og vil meget
 >>>> gerne have input fra eksperterne.
 >>>
 >>> Mit forslag:
 >>> CREATE FUNCTION ippart(@ip VARCHAR(16), @n INTEGER) RETURNS
 >>> VARCHAR(16) CREATE FUNCTION iprepl(@ipaddr VARCHAR(16), @ipseg
 >>> VARCHAR(16)) RETURNS
 >>
 >> Mange tak Arne - det fungere rigtigt godt.
 >
 > Indtil en dag, ipadressen er 2a00:1450:400c:c00::63; google.com's
 > ipv6-adresse.
 >
 > Men hellere vente et par år med det, så kan du tjene fede overarbejdspenge
 > på at rette det, når der går ipv6-panik i den, ligesom med
 > Y2K-problematikken   
Relevant pointe.
 Men hvad er løsningen?
 Den beskrevne logik er vist ikke umiddelbart overførbar til
 IPv6.
 Tilrette de UDF til at kunne håndtere IPv4 i IPv6 adresser
 br være trivielt - det må bare være at gøre felterne lidt
 længere.
 Arne
            
              |   |   
            
        
 
    
 
					
					 
			 | 
			
				
        
			 |