Jag är ingen hejjare på varken T-Sql eller dynamisk sql.
Jag använder eventuellt inbyggda funktioner och medtoder som inte är brukligt i vissa sammanhang,
ofta är det en stor nackdel och ibland så kanske det t.o.m. kan vara berikande och skapa nytänkande.
Nu till saken.
Denna dynamiska (på gränsen till hyperaktiva), sql:en har säkert många brister och min fråga är:
Om man nu skall normalisera databasen i partiklar och optimera så det står härliga till så leder
det ju även till att frågorna många gånger blir ruggigt komplexa (rätta mig om jag har fel).
Om jag nu vill presentera data ifrån länkade tabeller i en relationsdatabas efter önskemål,
så kan inte jag komma på någon annan lösning än denna (nedanför i kod-block) för att åstakomma det jag vill.
Skall man istället sammanställa alla sökdata så att det ligger i dubbla tabeller för att underlätta söknigen,
eller skall man skapa temporära tabeller?
Tacksam för en liten redogörelse av detta fenomen.
(Jag fick nämligen bassning i ett annat (dumt ;) ) forum, där av min fråga.)
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)