Måste den det eller går det att göra om till en "riktig" SP? 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.. Tack för visat intresse. 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. >Du skriver: Tack till er båda. 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. Nu har jag full-textindexerat de fält som jag vill söka ifrån. Det gick ju bra :-) Borde det inte vara så här: 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. Ytterligare ett förslag, borde vara en fungerande workaround: Då måste bara en variabel för varje sökord skapas och det är ju heller inte helt genialt. 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.Måste denna göras som en dynamisk sql?
<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>Sv: Måste denna göras som en dynamisk sql?
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.Sv:Måste denna göras som en dynamisk sql?
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 JesperSv: Måste denna göras som en dynamisk sql?
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.Sv: Måste denna göras som en dynamisk sql?
>-"...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å.Sv:Måste denna göras som en dynamisk sql?
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!Sv: Måste denna göras som en dynamisk sql?
Sv:Måste denna göras som en dynamisk sql?
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>Sv: Måste denna göras som en dynamisk sql?
<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.
/PelleSv:Måste denna göras som en dynamisk sql?
Tanken är att man skall kunna söka i samtliga indexerade fält i en sträng.
Sök: Stockholm skåneSv: Måste denna göras som en dynamisk sql?
<CODE>
set @Searchstring1 ='"*Stockholm*"'
set @Searchstring2 ='"*Skåne*"'
...
Contains(s.*, @Searchstring1) AND Contains(s.*, @Searchstring2)
...
</CODE>
/PelleSv:Måste denna göras som en dynamisk sql?
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.Sv: Måste denna göras som en dynamisk sql?
Tomma värden (NULL-värden) borde kunna hanteras på följande sätt:
<CODE>
Contains(s.*, COALESCE(@Searchstring10, ''))
</CODE>
/Pelle