Avatar billede mr.handstand Novice
25. april 2001 - 10:27 Der er 12 kommentarer og
1 løsning

MS SQL - stored procedure - returner recordset sorteret ud fra

findes der mon én, der kan klare den her med hånden på ryggen.

Tabel placeret på MS SQL 7.0
Navn: Table1
Felt: xkoordinat  (integer) 4byte
Felt: ykoordinat  (integer) 4byte
Felt: ID (key)
Felt: osv...

x- og ykoordinat er som vi kender det fra 8.klasses matematik, placeringen i et koordinatsæt.

Jeg skal liste alle records (via en stored procedure) som ligger indenfor et afgrænset område i koordinatsættet, og de skal sorteres ud fra afstanden til centrum af det givne område...

Jeg vil meget gerne have hjælp til følgende:
1. En stored procedure som modtager et område i koordinatsættet, dvs. 2 diagonal-hjørners xy koordinater, modtager (eller beregner) centrum af koordinatsættet, samt returnerer et recordsæt, sorteret ud fra afstanden til centrum

Afstanden til centrum er jo selvfølgelig dynamisk, afhængigt af input-var.

Efterfølgende - for at modtage pointene, skal du lige vise mig, hvordan man så i ASP henter den information som sp laver, altså loader det i et adodb.recordset
Avatar billede ldanielsen Nybegynder
25. april 2001 - 11:35 #1
Her er begyndelsen, men det skal flyttes over i asp, for at du kan få et recordset. Hvorfor skal det være en sp?

DECLARE @x1 float, @y1 float, @x2 float, @y2 float, @cx float, @cy float

Set @x1 = 3
Set @y1 = 20
Set @x2 = 20
Set @y2 = 2

Set @cx = (@x1 + @x2)/2
Set @cy = (@y1 + @y2)/2


SELECT x, y, SQRT(POWER(x-@cx,2) + POWER(y-@cy,2)) AS Dist FROM TEST WHERE
(x BETWEEN @x1 AND @x2 OR x BETWEEN @x2 AND @x1)
AND
(y BETWEEN @y1 AND @y2 OR y BETWEEN @y2 AND @y1)
ORDER BY Dist
Avatar billede mr.handstand Novice
25. april 2001 - 11:50 #2
Jeg ønsker det som en sp idet jeg forventer en compiled sp  kan eksekvere talbehandlingen hurtigere end u-kompileret ASP. Desuden forventer jeg at det er hurtigere at returnere sættet i den rigtige orden vil foregå hurtigere i sp end at skulle sortere  (og evt. beregne afstand til centrum data) i ASP efterfølgende.
Avatar billede ldanielsen Nybegynder
25. april 2001 - 12:03 #3
Denne laver kun beregningen af centrum i ASP, afstandsberegning og sortering foregår i SQL. Jeg kan ikke forestille mig at det skulle være tungt.

Jeg har ikke stor erfaring med at returnere værdier, har hørt at det ikke er måden at gøre det på.


x1 = 3
y1 = 20
x2 = 20
y2 = 2

cx = (x1 + x2)/2
cy = (y1 + y2)/2

SqlStr = \"SELECT x, y, SQRT(POWER(x-\"&cx&\",2) + POWER(y-\"&cy&\",2)) AS Dist FROM TEST WHERE (x BETWEEN \"&x1&\" AND \"&x2&\" OR x BETWEEN \"&x2&\" AND \"&x1&\") AND (y BETWEEN \"&y1&\" AND \"&y2&\" OR y BETWEEN \"&y2&\" AND \"&y1&\") ORDER BY Dist\"
Set Rec = Con.Execute(SqlStr)

Ikke testet i asp, så der er forbehold for småfejl. Den er testet i SQL
Avatar billede mr.handstand Novice
25. april 2001 - 12:38 #4
En \"anden\" grund til at jeg gerne vil have det som sp er, at jeg skal lære af det. Og det er lige præcist sp kontra asp som jeg ikke kan (faktisk er det sp som jeg ikke kan). SQL som sprog kan jeg selv klare, men det var via Access\'en og div. db-teori-fag at jeg lærte det. Derfor de mange point, for at få noget, som jeg selv kan implementere og se virker på min SQL7 kontra mine ASP-sider.

Derfor vil jeg gerne have det som sp. Iøvrigt mener jeg i længden at det bliver uoverskueligt at have alt min SQL liggende på diverse asp-sider (pt. er systemet på ikke under 125 asp-sider i alle afskygninger af includes osv). Nemmere behandling i forhold til ændringer i DB\'en bliver det, hvis alt SQL ligger i sp, som jeg kan gennemsøge ved ændrede forhold i DB\'en.Så hvis du vil vise mig hvordan jeg får ovenstående over i en sp og kaldt fra ASP er pointene dine... :-)
Avatar billede ldanielsen Nybegynder
25. april 2001 - 13:04 #5
Sådan laver du sp\'en i Enterprise Manager

CREATE PROCEDURE Afstand
@x1 float, @y1 float, @x2 float, @y2 float
AS

DECLARE  @cx float, @cy float

Set @cx = (@x1 + @x2)/2
Set @cy = (@y1 + @y2)/2

SELECT x, y, SQRT(POWER(x-@cx,2) + POWER(y-@cy,2)) AS Dist FROM TEST WHERE
(x BETWEEN @x1 AND @x2 OR x BETWEEN @x2 AND @x1)
AND
(y BETWEEN @y1 AND @y2 OR y BETWEEN @y2 AND @y1)
ORDER BY Dist


Og du kalder den med:

Set Rec = Con.Execute(\"EXEC Afstand 3, 20, 20, 2\")

Jeg vidste ikke at det kunne gøres.
Avatar billede mr.handstand Novice
25. april 2001 - 13:06 #6
Jeg vil gerne lige prøve at rode videre med den selv - tusind tak for hjælpen. Det øjeblik jeg får dit til at virke (indenfor et par dage, forhåbentligt) får du dine point..... ok?
Avatar billede ldanielsen Nybegynder
25. april 2001 - 13:11 #7
Ja, men det jeg har lavet virker nu her hos mig.

Du lader bare høre fra dig.

Jeg lærte også noget, nu mangler jeg bare at finde dokumentationen for det :o)

Hilsen Lars D
Avatar billede ldanielsen Nybegynder
25. april 2001 - 13:14 #8
Sådan her, så returnerer den ikke afstanden, men kun x og y:

SELECT x, y FROM TEST WHERE
(x BETWEEN @x1 AND @x2 OR x BETWEEN @x2 AND @x1)
AND
(y BETWEEN @y1 AND @y2 OR y BETWEEN @y2 AND @y1)
ORDER BY SQRT(POWER(x-@cx,2) + POWER(y-@cy,2))
Avatar billede ldanielsen Nybegynder
25. april 2001 - 19:06 #9
Nu finder den ud af om @x1 > @x2 osv. én gang, Så sparer du to stk. BETWEEN i SELECT\'en:

CREATE PROCEDURE Afstand
@x1 float, @y1 float, @x2 float, @y2 float

AS

DECLARE 
  @cx float,
  @cy float,
  @maxx float,
  @maxy float,
  @minx float,
  @miny float

IF @x1 < @x2
BEGIN
  SET @maxx = @x2
  SET @minx = @x1
END
ELSE
BEGIN
  SET @maxx = @x1
  SET @minx = @x2
END

IF @y1 < @y2
BEGIN
  SET @maxy = @y2
  SET @miny = @y1
END
ELSE
BEGIN
  SET @maxy = @y1
  SET @miny = @y2
END

SET @cx = (@x1 + @x2)/2
SET @cy = (@y1 + @y2)/2

SELECT x, y FROM Table1 WHERE
x BETWEEN @minx AND @maxx
AND
y BETWEEN @miny AND @maxy
ORDER BY SQRT(POWER(x-@cx, 2) + POWER(y-@cy, 2))
Avatar billede ldanielsen Nybegynder
01. maj 2001 - 11:53 #10
Hallo?? Hvordan går det? Jeg er lidt spændt på, og det er OK at returnere et recordset fra en sp, men har ikke selv fundt noget om det i ADO-dokumentationen.
Avatar billede ldanielsen Nybegynder
01. maj 2001 - 11:59 #11
http://msdn.microsoft.com/library/psdk/sql/adoprg02_525v.htm

Viser faktisk at det kan gøres, men med speciel teknik omkring parametre.

Jeg bruger helst så lidt ADO som muligt, for der er ingen der har kunnet forklare mig fordelen ved det modsatte.
Avatar billede mr.handstand Novice
01. maj 2001 - 14:34 #12
Det virker helt fint - beklager at jeg ikke har fået svaret før. Har lavet sp, som returnerer til adodb.recordset.
Nu mangler jeg blot at få lavet nogle test, der viser hastigheden på sp i forhold til ren asp.

Men tak for hjælpen!

/Søren
Avatar billede ldanielsen Nybegynder
01. maj 2001 - 18:28 #13
Glad for at kunne hjælpe, og det var jo en rigtig god pris

/Lars
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
Kurser inden for grundlæggende programmering

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