/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
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

Søg
Reklame
Statistik
Spørgsmål : 177549
Tips : 31968
Nyheder : 719565
Indlæg : 6408820
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste