webForumDet fria alternativet

StoredProcedure enkel fråga

11 svar · 213 visningar · startad av erka

erkaMedlem sedan dec. 19996 522 inlägg
#1

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
#2

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
#3

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
#4

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
#5

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
#6

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
#7

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
#8

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
#9

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
#10

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
#11
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
#12

tackar tackar, klar nu

------------------
Real mad hiphop flavaz kickin' it right from tha street without no FEAR, Yo !

130 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)