---
title: "StoredProcedure enkel fråga"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/21641-storedprocedure-enkel-fråga"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "erka"
published: "2001-10-02T09:16:00.000Z"
updated: "2001-10-02T11:39:00.000Z"
replies: 11
views: 213
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/21641-storedprocedure-enkel-fråga"
---

# StoredProcedure enkel fråga

## #1 — erka, 2001-10-02T09:16Z

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å ?

Permalänk: https://www.webforum.nu/p/21641

## #2 — LarsG, 2001-10-02T09:45Z

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.)

Permalänk: https://www.webforum.nu/p/352689

## #3 — erka, 2001-10-02T10:16Z

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.

Permalänk: https://www.webforum.nu/p/352690

## #4 — erka, 2001-10-02T10:47Z

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 ?

Permalänk: https://www.webforum.nu/p/352691

## #5 — LarsG, 2001-10-02T10:49Z

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. ;))

Permalänk: https://www.webforum.nu/p/352692

## #6 — LarsG, 2001-10-02T10:53Z

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

Permalänk: https://www.webforum.nu/p/352693

## #7 — erka, 2001-10-02T10:55Z

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

Permalänk: https://www.webforum.nu/p/352694

## #8 — erka, 2001-10-02T10:58Z

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)
```

Permalänk: https://www.webforum.nu/p/352695

## #9 — LarsG, 2001-10-02T11:02Z

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"

Permalänk: https://www.webforum.nu/p/352696

## #10 — erka, 2001-10-02T11:25Z

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

Permalänk: https://www.webforum.nu/p/352697

## #11 — LarsG, 2001-10-02T11:30Z

```
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)
```

Permalänk: https://www.webforum.nu/p/352698

## #12 — erka, 2001-10-02T11:39Z

tackar tackar, klar nu

Permalänk: https://www.webforum.nu/p/352699

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/21641-storedprocedure-enkel-fråga
