erkaMedlem sedan dec. 19996 522 inlägg Jag har stött på ännu ett litet problem med min sökfunktion.
Låt oss säga att vi har 2 bilmärken i vår databas, volvo och saab, dessa i sin tur är updelade i modeller.
Tex
Volvo
Modell : v70
Modell : v70 cc
Saab
Modell : 9 5
Modell . 9 5 turbo
De ligger i olika tabeller men är sammanknutna med en relation, one to many. Nu har jag en sp skriven för att sätta samman de båda, dels modell och bilmärke. Tex så att jag kan skriva ut Volvo v70 cc som en kolumn.
Min stored pro
CREATE PROCEDURE [sp_VpModelDesignSearch]
@DesignID varchar(100)
AS
SELECT dbo.vpDesign.PK_DesignID, dbo.vpModel.ModelName + ' ' + dbo.vpDesign.DesignName AS FullName
FROM dbo.vpModel INNER JOIN
dbo.vpDesign ON dbo.vpModel.PK_ModelID = dbo.vpDesign.FK_ModelID
WHERE (dbo.vpDesign.PublicOnWeb = 1) AND (dbo.vpModel.PublicOnWeb = 1) AND(dbo.vpDesign.DesignName LIKE '%' + @DesignId + '%' OR dbo.vpModel.ModelName LIKE '%' + @DesignId + '%')
ORDER BY FullName ASC
GO
Problemet är att om jag söker på volvo så kommer ju givetvis alla med volvo i ModelName upp och söker jag på v70 så kommer alla med v70 i DesignName upp. Men jag vill ju göra like frågan mot FullName fältet, men det verkar inte gå eftersom den inte är något "äkta" kolumn. Jag vill kunna skriva @intDesignId som Volvo v70 och få upp alla som innehåller både volvo samt v70
Finns det något sätt att lösa detta på ?
------------------
Real mad hiphop flavaz kickin' it right from tha street without no FEAR, Yo !
[Redigerat av erka den 02 okt 2001]
LarsGMedlem sedan dec. 200012 464 inlägg Jo, men det blir nog till att bygga sql-frågan dynamiskt i så fall
Något sådant
create procedure p(@searchWords varchar(50))
declare @likeCond varchar(200)
declare @sqlStr varchar(3000)
declare @pos int
declare @length int
declare @x int
declare @word varchar(30)
set @pos = 1
set @likeCond = ''
set @length = len(@searchWords)
while @length > 0
begin
set @x = charindex(substr(@searchWords,@pos,@length),' ')
if @x = 0
begin
set @word = substr(@searchWords,@pos,@length)
set @length = 0
end
else
begin
set @word = substr(@searchWords,@pos,@x+1)
set @pos = @pos + @x + 1
set @length = @length - @pos
end
set @likecond = @likecond +
' and dbo.vpDesign.DesignName + dbo.vpModel.ModelName like ''%' + @word
+ '%' '
end
set @sqlstr = 'select ... ' + @likecond
+ ' order by fullname '
exec (@sqlstr)
Du får säkert lägga till något +1 eller -1 på något ställe. Det är ganska mickligt att få till och du har inte så stor nytta av att det ligger i en stored procedure. Det kanske är enklare att bygga frågan i ASP direkt. (I alla fall enklare att testa ut den skulle jag tro.)
------------------
essentitia preter non sans multiplicandum
erkaMedlem sedan dec. 19996 522 inlägg Tack provade lite och märkte direkt att när jag sätter in sp:n så säger den
"substr is not a recognized funktion name"
Vaför blir det på detta vis ? har sökt men inte funnit svar.
------------------
Real mad hiphop flavaz kickin' it right from tha street without no FEAR, Yo !
erkaMedlem sedan dec. 19996 522 inlägg Tänkte på en sak. Hur skulle denna lösning fungera, inte den smidigaste men.
Jag öppnar först ett rs och tar infon från de båda fälten jag ska söka igenom och lägger i en 2 dim. array. Sen söker jag igenom den efter träffar ?
------------------
Real mad hiphop flavaz kickin' it right from tha street without no FEAR, Yo !
LarsGMedlem sedan dec. 200012 464 inlägg Därför att funktion heter substring i T-sql
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_setu-sus_6btz.asp
(Det är i Oracle den heter substr. ;))
------------------
essentitia preter non sans multiplicandum
LarsGMedlem sedan dec. 200012 464 inlägg
Jag öppnar först ett rs och tar infon från de båda fälten jag ska söka igenom och lägger i en 2 dim. array. Sen söker jag igenom den efter träffar ?
Njae, det går ju så länge du har små datamängder.
Det finns ju något som heter full text search som du kan söka efter på MSDN eller sök på CONTAINS i T-sql dok.
Jag vet inte speciellt mycket om hur det fungerar.
------------------
essentitia preter non sans multiplicandum
erkaMedlem sedan dec. 19996 522 inlägg ok tack för hjälpen ska kolla upp det där på msdn. Återkommer om jag stöter mer problem som jag tror du kan hjälpa mig med. Tack, du är en sann klippa ! Kommer skriva hyllnignslåtar snart :e The king has left the building, SALUT LARSG
------------------
Real mad hiphop flavaz kickin' it right from tha street without no FEAR, Yo !
[Redigerat av erka den 02 okt 2001]
erkaMedlem sedan dec. 19996 522 inlägg Hade visst en fråga
Du skriver
create procedure p(@searchWords varchar(50))
declare @likeCond varchar(200)
declare @sqlStr varchar(3000)
declare @pos int
declare @length int
declare @x int
declare @word varchar(30)
Vad skiljer det mot
create procedure [vp_search]
declare @searchWords varchar(50)
declare @likeCond varchar(200)
declare @sqlStr varchar(3000)
declare @pos int
declare @length int
declare @x int
declare @word varchar(30)
------------------
Real mad hiphop flavaz kickin' it right from tha street without no FEAR, Yo !
LarsGMedlem sedan dec. 200012 464 inlägg Det som skiljer är att mitt exempel är felaktigt, jag glömde ett as.
Eller menar du [namn] ?
[] behövs bara om du proceduren har ett namn som är samma som ett reserverat ord i T-sql. Om du vill skriva standardmässigt så är syntaxen
create procedure "select"
------------------
essentitia preter non sans multiplicandum
[Redigerat av LarsG den 02 okt 2001]
[Redigerat av LarsG den 02 okt 2001]
erkaMedlem sedan dec. 19996 522 inlägg LarsG, sissta frågan kanske ;) Jag har nu denna sp, men får inte fnuttarna att fungera direkt, försökt läsa ut dem, men inget verkar hjälpa.
create procedure "vp_search"
AS
declare @searchWords varchar(50)
declare @likeCond varchar(200)
declare @sqlStr varchar(3000)
declare @pos int
declare @length int
declare @x int
declare @word varchar(30)
set @pos = 1
set @likeCond = ''
set @length = len(@searchWords)
while @length > 0
begin
set @x = charindex(substring(@searchWords,@pos,@length),' ')
if @x = 0
begin
set @word = substring(@searchWords,@pos,@length)
set @length = 0
end
else
begin
set @word = substring(@searchWords,@pos,@x+1)
set @pos = @pos + @x + 1
set @length = @length - @pos
end
set @likecond = @likecond + ' AND dbo.vpDesign.DesignName + dbo.vpModel.ModelName LIKE ''%' + @word + '% ''
end
set @sqlstr = 'dbo.vpDesign.PK_DesignID, dbo.vpModel.ModelName + ' ' + dbo.vpDesign.DesignName AS FullName
FROM dbo.vpModel INNER JOIN
dbo.vpDesign ON dbo.vpModel.PK_ModelID = dbo.vpDesign.FK_ModelID
WHERE (dbo.vpDesign.PublicOnWeb = 1) AND (dbo.vpModel.PublicOnWeb = 1) AND ' + @likecond + ' ORDER BY FullName '
GO
Fnuttfanar alltså, Incorrect syntax near .dbo
Unclosed quotationmark before the character string
------------------
Real mad hiphop flavaz kickin' it right from tha street without no FEAR, Yo !
[Redigerat av erka den 02 okt 2001]
LarsGMedlem sedan dec. 200012 464 inlägg set @sqlstr = 'dbo.vpDesign.PK_DesignID, dbo.vpModel.ModelName + ' ' + 'dbo.vpDesign.DesignName AS FullName
FROM dbo.vpModel INNER JOIN
dbo.vpDesign ON dbo.vpModel.PK_ModelID = dbo.vpDesign.FK_ModelID
WHERE (dbo.vpDesign.PublicOnWeb = 1) AND (dbo.vpModel.PublicOnWeb = 1) ' + @likecond + ' ORDER BY FullName '
exec (@sqlstr)
------------------
essentitia preter non sans multiplicandum
erkaMedlem sedan dec. 19996 522 inlägg tackar tackar, klar nu
------------------
Real mad hiphop flavaz kickin' it right from tha street without no FEAR, Yo !