Avatar billede sbhansen Nybegynder
02. maj 2001 - 08:59 Der er 20 kommentarer og
1 løsning

Modtage en liste af integers i stored procedure

Hejsa,
et lille spm.
Hvordan får jeg min stored procedure til at modtage en liste i en variabel, således at

where id in(@ListOfIds)
skal blive til: WHERE id IN(30100, 40122, 32325)

har prøvet at dim\'e min @ListOfIds som varchar, men hvordan skal jeg føde min variabel i ASP\'en?
Avatar billede ldanielsen Nybegynder
02. maj 2001 - 09:22 #1
Må vi se sp\'en som den er nu?
Avatar billede sbhansen Nybegynder
02. maj 2001 - 09:51 #2
Selvfølgelig, her er den...

---

CREATE PROCEDURE [pr_MatchList]
(@catid char(50)=\'40342\' )
AS
SELECT  e.www,  e.name, e.address1
FROM Element e, CategoryElement c
WHERE
e.id=c.Element
AND c.category in (@catid)
ORDER BY  e.id asc
Return
Avatar billede sbhansen Nybegynder
02. maj 2001 - 10:07 #3
Hvis jeg hardcoder WHERE betingelsen, c.category in(@catid) som:

WHERE e.id=c.Element
and c.category in(200, 350, 10001)

Så virker det.

- så hvordan får jeg samme resultat, når jeg skal kalde det fra ASP?
Avatar billede torbenkoch Nybegynder
02. maj 2001 - 14:06 #4
Hvis du ved, at du har et eller andet maksimum for hvor mange elementer du kan have i din IN clause, så kan du lave et tilsvarende antal default parametre til din stored procedure:

CREATE PROCEDURE pr_MatchList
  @catid1 char(50) = \'40342\',
  @catid2 char(50) = \'\',
  @catid3 char(50) = \'\',
  ...
  @catidN char(50) = \'\'

og så lave IN clause sådan:

  c.Category in (@catid1, @catid2, ..., @catidN)

Ikke den smukkeste løsning, men jeg tror det er den mest nærliggende, du kan lave.
Avatar billede sbhansen Nybegynder
02. maj 2001 - 14:14 #5
venligt forsøg torbenkoch, men ikke en mulighed.

Jeg ved med sikkerhed at der ofte sendes en string (kommasepareret) med 15 værdier, teoretisk kan man sende 25 værdier. Der må altså ikke være en øvre grænse. Jeg er derfor interesseret i at kunne stoppe denne string direkte ind i min IN-selektion (102,104,107,...2009)osv.

Alternativt kan man måske lave en løkke. I VB /ASP ville jeg søge efter \",\" og tilføje værdien mellem 2 kommaer til min SQL - men det må da kunne laves smartere....
Men pointene kunne også gå til den, der kan vise i T-SQL, hvordan jeg skal opsplitte en semikolon/kommasepareret liste til noget brugbart i en IN-selektion.
Avatar billede torbenkoch Nybegynder
02. maj 2001 - 14:26 #6
Er det SQL 7 eller 2000 du bruger?

I 2000 kunne man måske bruge en funktion? Har ikke en 2000 lige ved hånden, så jeg kan ikke teste det!
Avatar billede sbhansen Nybegynder
02. maj 2001 - 14:35 #7
MS SQL7, desværre - ellers har du sikkert ret i at der er en eller anden funktion. Jeg har desværre ikke brugt tid på 2000, da vi nu engang har valgt at fokusere på at få alt basalt til at virke først...

Men kan det virkelig passe, at man er bedre stillet med en alm. SQL-streng lavet i asp. Da er det jo piece-of-cake at indsætte en kommesepareret string i et IN-udtryk... :-(
Avatar billede torbenkoch Nybegynder
02. maj 2001 - 14:49 #8
Nåh, kan trøste dig med, at jeg har en løsning til dig - jeg bruger en temporær tabel.

create procedure pr_MatchList
  @catid varchar(255)
AS
  declare @catidtmp varchar(50)
  declare @pos int
  declare @id int

  set nocount on
  create table #TempTable
  (
    AId int
  )

  select @catidtmp = @catid
  select @pos = CharIndex(\',\', @catidtmp)
  WHILE @pos > 0
  BEGIN
    select @id        = CONVERT(int, SubString(@catidtmp, 1, @pos-1))
    select @catidtmp  = SubString(@catidtmp, @pos+1, Len(@catidtmp))
    insert #TempTable (AId) values (@id)
    select @pos = CharIndex(\',\', @catidtmp) 
  END
  insert #TempTable (AId) values (@catidtmp)

  -- Her skal du indsætte din egen select!!
  select * from t1 where id in (select aid from #TempTable)
  --
  drop table #TempTable

  set nocount off
Avatar billede sbhansen Nybegynder
02. maj 2001 - 14:56 #9
ok, torben - det vil jeg gerne lige have lov at vende tilbage på...

Det er jo formentligt brugbart, og når jeg får det til at virke, så skal du nok få pointene, men det er stadig ikke løsningen som jeg vil bruge - når jeg kommer til vejs ende, altså...

Jeg forsøger at optimere vores asp-sider, og forventede at en overgang til i højere grad at brug t-sql ville speede processen lidt op. Men ovennævnte ser ikke hurtigt ud - selv om det løser problemet.

I forhold til at oprette en temp tabel vil det nok være hurtigst at skyde SQL\'en af direkte fra ASP\'en.

Nå, men jeg skal nok vende tilbage...
Avatar billede mwittrock Nybegynder
02. maj 2001 - 14:58 #10
sbhansen,

kig evt. her:

http://www.eksperten.dk/spm/69463

Det problem ser ud til at minde om dit...
Avatar billede torbenkoch Nybegynder
02. maj 2001 - 15:03 #11
mwittrock, du har faktisk ret, det er ganske meget simplere end min løsning og ser ud til at virke i dette tilfælde også!
Avatar billede sbhansen Nybegynder
02. maj 2001 - 15:06 #12
Jeg er igang med at prøve...
Den stored procedure jeg har postet her, er ikke min \"rigtige\" sp_code. Den egentlige sp er gevaldigt meget større, men der var ingen grund til at poste unødige data - så det skal lige implementeres...
Avatar billede sbhansen Nybegynder
02. maj 2001 - 15:40 #13
Øhhh. må jeg ikke få det én gang til for prins Knud.
Vil du hjælpe mig med at vise det med brug af en variabel.
Her er den sp_ fra længere oppe i den her streng

CREATE PROCEDURE [pr_MatchList]
(@catid char(150)=\'40342\' )
AS
SELECT  e.www,  e.name, e.address1
FROM Element e, CategoryElement c
WHERE
e.id=c.Element
AND c.category in (@catid)
ORDER BY  e.id asc
Return

skal det så være:
AND c.category in (REPLACE(@catid,\';\',\', \'))
og i givet fald, kan jeg så bare sende en streng til den med: @catid=\'30100;40400;10001\'

Pt. får jeg INGEN fejl, hvis jeg sender én variabel i @catid:
pr_MatchList @catid=\'30100\'

Men med:  @catid=\'30100;40476\'
får jeg følgende fejl:

Syntax error converting the varchar value \'30100,40476\' to a column of data type int.

Hvad er det jeg ikke fatter?

Det hjælper ikke for mig at fjerne \'pingerne\':

med: @catid=30100;40476
får jeg fejlen:
Line 1: Incorrect syntax near \';\'.

Æv.. :-)
Nå, det er rart at vide, at der findes nogle, der ved bedre...
Avatar billede sbhansen Nybegynder
02. maj 2001 - 15:54 #14
feltet, der skal laves opslag i er integer
således virker:
WHERE e.id=c.Element
and c.category in(200, 350, 10001)

- bare en kommentar...
Avatar billede mwittrock Nybegynder
02. maj 2001 - 15:56 #15
Du skal gøre lig det følgende:

CREATE PROCEDURE pr_MatchList (@catid varchar(150))
AS

  DECLARE @sql NVARCHAR(500)
  SET @sql = N\'SELECT e.www,e.name, e.address1 FROM Element e,CategoryElement c WHERE e.id=c.Element AND c.category in (\' + @catid + \') ORDER BY e.id ASC\'
  EXEC sp_executesql @sql

Herefter udfører du den som:

EXEC pr_MatchList \'200, 350, 10001\'
Avatar billede sbhansen Nybegynder
02. maj 2001 - 16:07 #16
Hvor ville jeg gerne acceptere det du sender - det ser jo simpelt ud - men stadig får jeg den fejl jeg startede med:
det her gør jeg:
exec pr_MatchList @catid=\'30100, 40342, 32236\'

Min procedure indeholder:
deklarationen:
(@catid varchar(150))


Betingelsen:
and c.category in (\' + @catid + \')



og min FEJL er:
Syntax error converting the varchar value \' + @catid + \' to a column of data type int.

Please... :-)
Avatar billede sbhansen Nybegynder
02. maj 2001 - 16:09 #17
Hvad er iøvrigt N\'SELECT i forhold til den SELECT jeg bruger, og hvorfor går du omkring sp_executesql med din SQL-streng?

Det kan vel ikke være her jeg har mit problem?
Avatar billede mwittrock Nybegynder
02. maj 2001 - 16:12 #18
sp_executesql bruges til at udføre SQL sætninger, som er opbygget dynamisk (som i dit tilfælde, hvor en del af sætningen først er kendt når dit program kører). Proceduren vil have SQL sætningen som NVARCHAR, og N\'...\' indikerer at strengen er NVARCHAR.

Har du oprettet proceduren nøjagtigt som jeg skrev den (copy+paste ind i Query Analyzer)?
Avatar billede sbhansen Nybegynder
02. maj 2001 - 16:21 #19
Jeg prøvede at paste den ind - dvs. se HELT bort fra min egen kode... DET VIRKEDE.

Nu skal jeg bare finde ud af, hvorfor min egen kode ikke fungerer... :-)

Problematikken er kun en lille del af en ret kompliceret selekt-statement, som jeg forsøgte at få til at virke på én gang... Hmmm. Det lærer man jo også af.

Men DIT virker. Tak for hjælpen - så har jeg blot lidt arbejde forude med mit eget...
Avatar billede sbhansen Nybegynder
02. maj 2001 - 16:23 #20
Vil du lægge et element som et svar - så du kan få pointene, mwittrock. Jeg synes dit svar er, hvad jeg søgte...
Avatar billede mwittrock Nybegynder
02. maj 2001 - 16:24 #21
Ah ok, jeg er ikke helt inde i hvordan tingene fungerer herinde endnu :) Hermed gjort, og tak.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester