Avatar billede sbarnney Nybegynder
20. januar 2005 - 11:08 Der er 6 kommentarer og
1 løsning

Omskrive Oracle funktion til MS SQL.

min oracle function:

CREATE OR REPLACE PACKAGE BODY EL_PRODA.TCPIP IS

  FUNCTION IP_TO_NUMBER (p_ipaddress varchar2) RETURN number IS
    c_ipaddress1 char(3);
    c_ipaddress2 char(3);
    c_ipaddress3 char(3);
    c_ipaddress4 char(3);
    c_ipaddress varchar(15);
    n_ipaddress number(15);
    n_dot_pos number(2);
  BEGIN
    c_ipaddress := p_ipaddress;
      n_dot_pos := instr(c_ipaddress,'.',1,1);
    c_ipaddress1 := lpad(substr(c_ipaddress,1,n_dot_pos-1),3,'0');
    c_ipaddress := substr(c_ipaddress,n_dot_pos+1,length(c_ipaddress)-n_dot_pos);

      n_dot_pos := instr(c_ipaddress,'.',1,1);
    c_ipaddress2 := lpad(substr(c_ipaddress,1,n_dot_pos-1),3,'0');
    c_ipaddress := substr(c_ipaddress,n_dot_pos+1,length(c_ipaddress)-n_dot_pos);

    n_dot_pos := instr(c_ipaddress,'.',1,1);
    c_ipaddress3 := lpad(substr(c_ipaddress,1,n_dot_pos-1),3,'0');
    c_ipaddress := substr(c_ipaddress,n_dot_pos+1,length(c_ipaddress)-n_dot_pos);

    c_ipaddress4 := lpad(c_ipaddress,3,'0');

    n_ipaddress := to_number(c_ipaddress1||c_ipaddress2||c_ipaddress3||c_ipaddress4);
    RETURN (n_ipaddress);
  END;

END;
/

Er der en der kan omskrive denne funktion til MS SQL ??

MVH Stig
Avatar billede lorentsnv Nybegynder
20. januar 2005 - 15:47 #1
Se om du kan bruge følgende.
Jeg kan ikke bruge RETURN(@n-ipaddress), da RETURN på SQL Server kun kan retunere vanlig integer, og nummeret bliver for stort. Derfor returnerer jeg værdien som SELECT.

CREATE PROCEDURE IP_TO_NUMBER
    @p_ipaddress varchar(100) 
AS

DECLARE @c_ipaddress1 as char(3)
DECLARE @c_ipaddress2 as char(3)
DECLARE @c_ipaddress3 as char(3)
DECLARE @c_ipaddress4 as char(3)
DECLARE @c_ipaddress as varchar(15)
DECLARE @n_ipaddress as bigint
DECLARE @n_dot_pos as int
Declare @c_padds as char(3)

Set     @c_padds = '000'
Set    @c_ipaddress = @p_ipaddress
Set    @n_dot_pos = CHARINDEX('.',@c_ipaddress)

Set    @c_ipaddress1 = cast(SUBSTRING (@c_ipaddress,1,@n_dot_pos-1) as varchar(3))
Set    @c_ipaddress1 = left(@c_padds, 3 -  len(@c_ipaddress1)) + @c_ipaddress1
Set    @c_ipaddress = SUBSTRING(@c_ipaddress,@n_dot_pos+1,len(@c_ipaddress)-@n_dot_pos)

Set    @n_dot_pos = CHARINDEX('.',@c_ipaddress)
Set    @c_ipaddress2 = cast(SUBSTRING (@c_ipaddress,1,@n_dot_pos-1) as varchar(3))
Set    @c_ipaddress2 = left(@c_padds, 3 -  len(@c_ipaddress2)) + @c_ipaddress2
Set    @c_ipaddress = SUBSTRING(@c_ipaddress,@n_dot_pos+1,len(@c_ipaddress)-@n_dot_pos)

Set    @n_dot_pos = CHARINDEX('.',@c_ipaddress)
Set    @c_ipaddress3 = cast(SUBSTRING (@c_ipaddress,1,@n_dot_pos-1) as varchar(3))
Set    @c_ipaddress3 = left(@c_padds, 3 -  len(@c_ipaddress3)) + @c_ipaddress3
Set    @c_ipaddress = SUBSTRING(@c_ipaddress,@n_dot_pos+1,len(@c_ipaddress)-@n_dot_pos)

Set    @c_ipaddress4 = left(@c_padds, 3 -  len(@c_ipaddress)) + @c_ipaddress
Set      @c_ipaddress = (@c_ipaddress1 + @c_ipaddress2 + @c_ipaddress3 + @c_ipaddress1)

Set     @n_ipaddress = cast(@c_ipaddress as bigint)

select @n_ipaddress as n_ipaddress

GO
Avatar billede lorentsnv Nybegynder
20. januar 2005 - 15:49 #2
Jeg fjernet lige en unødvendig linie:

CREATE PROCEDURE IP_TO_NUMBER
    @p_ipaddress varchar(100) 
AS

DECLARE @c_ipaddress1 as char(3)
DECLARE @c_ipaddress2 as char(3)
DECLARE @c_ipaddress3 as char(3)
DECLARE @c_ipaddress4 as char(3)
DECLARE @c_ipaddress as varchar(15)
DECLARE @n_ipaddress as bigint
DECLARE @n_dot_pos as int
Declare @c_padds as char(3)

Set     @c_padds = '000'
Set    @c_ipaddress = @p_ipaddress
Set    @n_dot_pos = CHARINDEX('.',@c_ipaddress)

Set    @c_ipaddress1 = cast(SUBSTRING (@c_ipaddress,1,@n_dot_pos-1) as varchar(3))
Set    @c_ipaddress1 = left(@c_padds, 3 -  len(@c_ipaddress1)) + @c_ipaddress1
Set    @c_ipaddress = SUBSTRING(@c_ipaddress,@n_dot_pos+1,len(@c_ipaddress)-@n_dot_pos)

Set    @n_dot_pos = CHARINDEX('.',@c_ipaddress)
Set    @c_ipaddress2 = cast(SUBSTRING (@c_ipaddress,1,@n_dot_pos-1) as varchar(3))
Set    @c_ipaddress2 = left(@c_padds, 3 -  len(@c_ipaddress2)) + @c_ipaddress2
Set    @c_ipaddress = SUBSTRING(@c_ipaddress,@n_dot_pos+1,len(@c_ipaddress)-@n_dot_pos)

Set    @n_dot_pos = CHARINDEX('.',@c_ipaddress)
Set    @c_ipaddress3 = cast(SUBSTRING (@c_ipaddress,1,@n_dot_pos-1) as varchar(3))
Set    @c_ipaddress3 = left(@c_padds, 3 -  len(@c_ipaddress3)) + @c_ipaddress3
Set    @c_ipaddress = SUBSTRING(@c_ipaddress,@n_dot_pos+1,len(@c_ipaddress)-@n_dot_pos)

Set    @c_ipaddress4 = left(@c_padds, 3 -  len(@c_ipaddress)) + @c_ipaddress

Set     @n_ipaddress = cast((@c_ipaddress1 + @c_ipaddress2 + @c_ipaddress3 + @c_ipaddress1) as bigint)

select @n_ipaddress as n_ipaddress
GO
Avatar billede lorentsnv Nybegynder
20. januar 2005 - 15:56 #3
Sorry, det skal være en function og ikke procedure, jeg prøver lige at omskrive denne....
Avatar billede lorentsnv Nybegynder
20. januar 2005 - 16:08 #4
Her er den som function.

CREATE FUNCTION IP_TO_NUMBER     (@p_ipaddress varchar(15))
RETURNS bigint AS 

BEGIN
DECLARE @c_ipaddress1 char(3)
DECLARE @c_ipaddress2 char(3)
DECLARE @c_ipaddress3 char(3)
DECLARE @c_ipaddress4 char(3)
DECLARE @c_ipaddress varchar(15)
DECLARE @n_ipaddress bigint
DECLARE @n_dot_pos int
Declare @c_padds char(3)


Set     @c_padds = '000'
Set    @c_ipaddress = @p_ipaddress
Set    @n_dot_pos = CHARINDEX('.',@c_ipaddress)

Set    @c_ipaddress1 = cast(SUBSTRING (@c_ipaddress,1,@n_dot_pos-1) as varchar(3))
Set    @c_ipaddress1 = left(@c_padds, 3 -  len(@c_ipaddress1)) + @c_ipaddress1
Set    @c_ipaddress = SUBSTRING(@c_ipaddress,@n_dot_pos+1,len(@c_ipaddress)-@n_dot_pos)

Set    @n_dot_pos = CHARINDEX('.',@c_ipaddress)
Set    @c_ipaddress2 = cast(SUBSTRING (@c_ipaddress,1,@n_dot_pos-1) as varchar(3))
Set    @c_ipaddress2 = left(@c_padds, 3 -  len(@c_ipaddress2)) + @c_ipaddress2
Set    @c_ipaddress = SUBSTRING(@c_ipaddress,@n_dot_pos+1,len(@c_ipaddress)-@n_dot_pos)

Set    @n_dot_pos = CHARINDEX('.',@c_ipaddress)
Set    @c_ipaddress3 = cast(SUBSTRING (@c_ipaddress,1,@n_dot_pos-1) as varchar(3))
Set    @c_ipaddress3 = left(@c_padds, 3 -  len(@c_ipaddress3)) + @c_ipaddress3
Set    @c_ipaddress = SUBSTRING(@c_ipaddress,@n_dot_pos+1,len(@c_ipaddress)-@n_dot_pos)

Set    @c_ipaddress4 = left(@c_padds, 3 -  len(@c_ipaddress)) + @c_ipaddress

Set     @n_ipaddress = cast((@c_ipaddress1 + @c_ipaddress2 + @c_ipaddress3 + @c_ipaddress1) as bigint)


Return(@n_ipaddress)
END
Avatar billede sbarnney Nybegynder
27. januar 2005 - 08:00 #5
Når jeg selecter

"SELECT * FROM r WHERE s = 0 AND i = 498 Order by dbo.IP_TO_NUMBER(ip)"

får jeg følgende fejl ??

"Invalid length parameter passed to the substring function."

Hvad betyder det. ?

Stig
Avatar billede sbarnney Nybegynder
27. januar 2005 - 14:39 #6
Jeg skal da huske at give dig dine point, det andet er jo bare et tillægs spørgsmål.
Avatar billede lorentsnv Nybegynder
27. januar 2005 - 15:38 #7
Jeg har lavet en simpel test selv, og kan umiddelbart godt lave en 'Order by dbo.IP_TO_NUMBER(ip)'.

Det kunne derfor tyde på at du har enten en tom ip-adresse, eller en ip adresse der ikke indeholder 3 punktummer. Funktionen tager ikke højde for at der bliver sendt en forkært ip-adresse i form af NULL-værdi, et tomt felt eller en ip-adresse som ikke inneholder 3 punktummer.

Kan du checke om du har nogle forkærte ip-adresser?
Fungerer funktionen ellers som den skal?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester