Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Måste denna göras som en dynamisk sql?

Postades av 2005-02-03 03:15:07 - Jesper Thörn, i forum databaser, Tråden har 12 Kommentarer och lästs av 1002 personer

Måste den det eller går det att göra om till en "riktig" SP?
<code> DECLARE @param1 as varchar(150),@sql as varchar(2000),@mycount as int,@c as int
DECLARE @andor as varchar(3), @curr as varchar(3),@orderby as varchar(20)
SET @c=0
SET @andor = 'OR'
SET @sql = ''
SET @curr='SEK'
SET @orderby = '1,2,3,4,5'
SET @param1 = Replace('Detta är ett test',' ','.')
SET @mycount = (select len(@param1) - len(replace(@param1,'.','')))

WHILE @c <= @mycount

BEGIN
SET @sql = @sql + '(s.keywords LIKE ''%'+ PARSENAME(@param1, @c+1) +'%'' OR s.city LIKE ''%'+ PARSENAME(@param1, @c+1) +'%'' OR s.province LIKE ''%'+ PARSENAME(@param1, @c+1) +'%'' OR c.cKeywords LIKE ''%'+ PARSENAME(@param1, @c+1) +'%'') '+ @andor +' '
SET @c=@c+1
END

SET @sql = left(@sql,len(@sql)-3)

SET @sql = 'SELECT s.id,min(sp.picid),s.province,s.city,
s.bedsh,s.bedr,s.bathr,s.area,s.dish,s.wash,s.air,
s.ppool,s.smook,c.cNameEN,
min(p.pricew)*r.rate,
max(p.pricew)*r.rate,s.advid
FROM search1 AS s
LEFT JOIN search_pics as sp ON s.id=sp.shid
INNER JOIN countries AS c ON s.country=c.id
INNER JOIN pricecategory as p ON s.id=p.shid
INNER JOIN ratesnew as r ON r.currencyF=p.currency
WHERE r.currencyT='''+ @curr +''' AND s.bedsl>=0 AND s.bedsh<=9999 AND ('+ @sql +')
GROUP BY s.id,s.province,s.city,s.bedsh,s.bedr,s.bathr,s.area,
s.dish,s.wash,s.air,s.ppool,s.smook,c.cNameEN,r.rate,s.advid
ORDER BY '+ @orderby

exec(@sql)</code>


Svara

Sv: Måste denna göras som en dynamisk sql?

Postades av 2005-02-03 08:43:43 - Christoffer Hedgate

Ok, först och främst, är du säker på att det här är det bästa sättet att lösa vad du vill lösa? Inga index i världen kommer att kunna hjälpa dig med prestanda om du får mycket data..

Nåväl, dynamiken i ORDER BY kan du ju skippa, den löses lika bra i klienten. @curr har vi tidigare använt utan dynamisk sql, så den tror jag du fixar. Slutligen då @sql och alla dess villkor. Den blir nog svår att få till på något bra vis, men eftersom du begränsat dig till max fyra ord (annorlunda användning av parsename får jag säga, kanske inte helt rekommenderat det heller) så kan du ju skriva sökvillkoren fyra gånger helt enkelt. Då får du splitta upp strängen till fyra parametrar i klienten och sen använda dessa i respektive villkor. Dock får du nog ha två olika procedurer för and/or av villkoren.

Men som sagt, vare sig med eller utan dynamisk sql så är det inte snyggt.

PS. Lägg helst SQL Server-specifika frågor i SQL Server-forumet istället för det generella databas-forumet. DS.


Svara

Sv:Måste denna göras som en dynamisk sql?

Postades av 2005-02-03 12:48:58 - Jesper Thörn

Tack för visat intresse.
Det kan mycke väl vara så att den är tung-rodd men jag har ingen aning om hur man skulle kunna lösa det på ett annat sätt om jag vill ha med alla värden och resultat med i sökningen.
Du skriver:
-"...men eftersom du begränsat dig till max fyra ord "
Det är ju det jag inte gjort.
Den söker efter varje ord i fyra kolumner. Loopen är tänkt att splitta upp alla sökord och söka efter vart och ett.

Hur skulle du göra/tänka?

Jag skall tänka på var jag postar inläggen. Går det att flytta?

MVH Jesper


Svara

Sv: Måste denna göras som en dynamisk sql?

Postades av 2005-02-03 13:46:31 - Marcus Gus

jag ställer mig precis som Christoffer undrande om det verkligen är det sätt du vill lösa det på? Jag hade definierat en fritextsökning på på 4 kolumnerna du gör en sökning på och använt mig av den. För att få mer info om fritextsökningar så sök på Freetext i hjälpen. Hur @Searchstring skall se ut för att fungera står oxå i hjälpen.

OBS nedanstående fungerar inte rakt av, men visar hur mycket simplare det blir att förstå sökningen. Den borde dessutom bli bra mycket snabbare än den sökning du har definierat upp ovan.
<code>
Create procedure DoTheFunkyStuff (@curr whatever, @Searchstring långsträng)

as

SELECT s.id,min(sp.picid),s.province,s.city,
s.bedsh,s.bedr,s.bathr,s.area,s.dish,s.wash,s.air,
s.ppool,s.smook,c.cNameEN,
min(p.pricew)*r.rate,
max(p.pricew)*r.rate,s.advid
FROM search1 AS s
LEFT JOIN search_pics as sp ON s.id=sp.shid
INNER JOIN countries AS c ON s.country=c.id
INNER JOIN pricecategory as p ON s.id=p.shid
INNER JOIN ratesnew as r ON r.currencyF=p.currency
WHERE r.currencyT= @curr
AND s.bedsl>=0
AND s.bedsh<=9999
AND Contains(*, @Searchstring)
GROUP BY s.id,s.province,s.city,s.bedsh,s.bedr,s.bathr,s.area,
s.dish,s.wash,s.air,s.ppool,s.smook,c.cNameEN,r.rate,s.advid
GO
</code>


Edit: Förtydligande, Order By får man lösa efter att datat har hämtas (tex i ett dataset om man använder .net) och att formatera @Searchstring ligger inte heller i SP'n utan det får anropande applikation fixa till. men det här är bara ett sätt att lösa det, finns många bättre och sämre sätt med.


Svara

Sv: Måste denna göras som en dynamisk sql?

Postades av 2005-02-03 14:18:09 - Christoffer Hedgate

>Du skriver:
>-"...men eftersom du begränsat dig till max fyra ord "
>Det är ju det jag inte gjort.
>Den söker efter varje ord i fyra kolumner. Loopen är tänkt att splitta upp alla sökord och söka efter vart och ett.

Du använder ju PARSENAME för att plocka ut respektive ord ur strängen. Den kan bara hantera upp till fyra 'ord' med punkter mellan. Jag sätter 'ord' inom citationstecken eftersom PARSENAME inte alls är tänkt att användas på det viset.

>Hur skulle du göra/tänka?

Svårt att säga utan att vara fullständigt insatt i hela miljön. Men det är möjligt att en annorlunda design skulle kunna förenkla det. Annars är ju fritextsökning som Marcus föreslog en möjlighet. Ett uttryck jag hittat på och som jag ofta citerar mig själv på är '<i>Ett problem som inte kan lösas med en mängdbaserad sql-sats är ofta inte ett problem för databashanteraren att lösa</i>'. Det kan vara en lite extrem synvinkel, men det är bra att ha som utgångspunkt.

>Jag skall tänka på var jag postar inläggen. Går det att flytta?

Jag kan flytta det som moderator. Men det är ingen fara, det ligger ju bra här också.


Svara

Sv:Måste denna göras som en dynamisk sql?

Postades av 2005-02-03 15:31:43 - Jesper Thörn

Tack till er båda.
Jag visste inte äns att contains() fanns.
Dock såg jag att fritext server servicen måste vara igång för att indexera tabellerna.
Någon sådan har jag ingen tillgång till. Måste webbhotellet göra det åt mig?

http://sqlteam.com/item.asp?ItemID=114

Hej hopp!


Svara

Sv: Måste denna göras som en dynamisk sql?

Postades av 2005-02-03 16:34:54 - Christoffer Hedgate

Ja, ska du använda Full-Text Search så måste någon lägga in det på servern om den inte finns. Sen är det en del ytterligare administration som behövs för att indexera din data, det är möjligt att du kan göra det själv beroende på vilka rättigheter du har i SQL Server.


Svara

Sv:Måste denna göras som en dynamisk sql?

Postades av 2005-02-04 18:40:27 - Jesper Thörn

Nu har jag full-textindexerat de fält som jag vill söka ifrån. Det gick ju bra :-)

Men det uppstår lite problem om jag vill söka med AND.
Om jag indexerat ex. kolumnerna City och province
Och har rader i tabellen som ser ut så ungefär så här:

1|Stockholm|Skåne|Villa| osv.
2|New York |NY |Apartment | osv.

och söker på Stockholm skåne så får jag noll(0) träffar även fast jag rimligtvis(med min logik) borde få en.

Söker jag med OR så bluddrar det fram poster.
Finns det någon work around för detta?

<code>
set @Searchstring ='"*Stockholm*" AND "*Skåne*"'
...
Contains(s.*, @Searchstring)
...
</code>


Svara

Sv: Måste denna göras som en dynamisk sql?

Postades av 2005-02-04 20:02:27 - Per Karlsson

Borde det inte vara så här:
<code>
set @Searchstring1 ='"*Stockholm*"'
set @Searchstring2 ='"*Skåne*"'

...
Contains(s.city, @Searchstring1) AND Contains(s.province, @Searchstring2)
...
</code>

Jag kanske iofs missförstått då jag inte själv har använt full-text search. Min variant är ju inte lika flexibel.

/Pelle


Svara

Sv:Måste denna göras som en dynamisk sql?

Postades av 2005-02-04 21:50:44 - Jesper Thörn

Visst, kanske det men då måste man veta att stockholm är en stad och att skåne är en province. Och det gör man ju inte om det är ett sökfält.
Tanken är att man skall kunna söka i samtliga indexerade fält i en sträng.

Sök: Stockholm skåne


Svara

Sv: Måste denna göras som en dynamisk sql?

Postades av 2005-02-04 23:38:07 - Per Karlsson

Ytterligare ett förslag, borde vara en fungerande workaround:

<CODE>
set @Searchstring1 ='"*Stockholm*"'
set @Searchstring2 ='"*Skåne*"'

...
Contains(s.*, @Searchstring1) AND Contains(s.*, @Searchstring2)
...
</CODE>

/Pelle


Svara

Sv:Måste denna göras som en dynamisk sql?

Postades av 2005-02-07 17:06:42 - Jesper Thörn

Då måste bara en variabel för varje sökord skapas och det är ju heller inte helt genialt.

Tänk dig en sökning ex. caféer södermalm stockholm

Det går ju heller inte att mata in nullsträngar i contains av naturliga skäl.

Men det går ju såklart att låta bli den lagrade pruceduren och skapa sql-en i scriptet. (ASP)
Men det var ju prestandan jag ville åt. Men det ser inte bättre ut. Jag har heller inte hittat så mycket på nätet. Får söka lite till.

Tack så länge.


Svara

Sv: Måste denna göras som en dynamisk sql?

Postades av 2005-02-07 21:20:10 - Per Karlsson

Om du inte hittar någon bra lösning på detta i sql och inte vill använda dynamisk sql så är mitt förslag att begränsa antalet sökord till ett förutbestämt värde, t.ex. 10 st. Sedan gör du en split av strängen i asp-koden och skickar in varje sökord för sig som en egen parameter till sp:n. Denna uppdelning går ju också att göra i sp:n med hjälp av sql servers strängfunktioner, men det blir knöligare.

Tomma värden (NULL-värden) borde kunna hanteras på följande sätt:
<CODE>
Contains(s.*, COALESCE(@Searchstring10, ''))
</CODE>

/Pelle


Svara

Nyligen

  • 19:13 Международная перевозка грузов
  • 00:01 DL Van Tuning | Exclusive Body Kit
  • 12:08 Indian casino
  • 04:14 Vad finns det för kratomalternativ
  • 14:16 Indian online casino
  • 14:15 Indian online casino
  • 08:28 Butiksskyltar: Hur upplever utbude
  • 22:31 Slappna av

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 864
27 962
271 767
433
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies