|  | 		    
					
        
         
          
         
	
          | |  | 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
            
             |  |  | 
 |  |