Den moderne arbejdsplads er i stigende grad afhængig af mødelokaler til at fremme samarbejde, men dette skift medfører også stigende sikkerhedsudfordringer.
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
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:
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.
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... :-(
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.
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...
Ø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...
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
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.
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)?
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...
Ah ok, jeg er ikke helt inde i hvordan tingene fungerer herinde endnu :) Hermed gjort, og tak.
Synes godt om
Ny brugerNybegynder
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.