/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
smorch 260
10  svend_dyhr 250
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 : 177821
Tips : 31980
Nyheder : 719565
Indlæg : 6410979
Brugere : 218912

Månedens bedste
Årets bedste
Sidste års bedste