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