Avatar billede socle Nybegynder
24. oktober 2003 - 20:14 Der er 18 kommentarer og
1 løsning

smukkere sql m asp og access

Hej

Jeg har et tekststreng m. kommasep. tal. Hvert tal svarer til et id nummer i en access tabel. Jeg har læst mig til at der højst kan være 40 klausuler (id = [tal]) i en sql streng. Da der kan forekomme mere end 40 tal i min kommesep. tekststreng, vil jeg gerne vide om der er en metode til at undgå at generere en klausul for hvert tal i strengen. Jeg har forsøgt med:

SELECT * FROM tabel WHERE id = ANY {1,25,12,34,n}

men får fejlen:
Microsoft JET Database Engine error '80040e14'
Malformed GUID. in query expression 'id = ANY {1,5,2}'.

Jeg vil gerne undgå:

SELECT * FROM tabel WHERE id = 1 OR id = 2 OR id = 3 OR id = n

Er det muligt?

Jeg kan ikke bruge BETWEEN fordi tallene ikke ligger op ad hinanden. Tallene er heller ikke i udgangspunktet ordnede, men kan blive det hvis det er nødvendigt.
Avatar billede htm Nybegynder
24. oktober 2003 - 20:16 #1
Måske:
SELECT * FROM tabel WHERE id IN (1,25,12,34,n)

??
Avatar billede erikjacobsen Ekspert
24. oktober 2003 - 20:21 #2
htm's "trick" virker i hvert fald i MySql. ;)
Avatar billede socle Nybegynder
24. oktober 2003 - 20:34 #3
jeg får samme fejl som før. måske er der noget galt et andet sted.. måske kan {} slet ikke bruges i access..?

Microsoft JET Database Engine error '80040e14'
Malformed GUID. in query expression 'id IN {27,37}'.
Avatar billede htm Nybegynder
24. oktober 2003 - 20:36 #4
Det er ikke tuborg {} men paranteser () du skal bruge!
Avatar billede socle Nybegynder
24. oktober 2003 - 20:42 #5
ok, halvblind her i denne her ende...

det virker desværre stadig ikke. tror den forventer en subquery

ADODB.Fields error '800a0cc1'
ADO could not find the object in the collection corresponding to the name or ordinal reference requested by the application.
Avatar billede htm Nybegynder
24. oktober 2003 - 20:44 #6
OK så kan jeg ikke optimere din SQL. Det "trick" der virker i mysql og vist nok mssql. Men åbenbart ikke access.
Avatar billede socle Nybegynder
24. oktober 2003 - 20:47 #7
Jeg har lige fundet noget på msdn

noget tyder på at IN, ALL, ANY og SOME forventer en subquery. en streng kan altså ikke bruges. Hvis det er rigtigt er det godt nok noget omstændeligt.
Avatar billede socle Nybegynder
24. oktober 2003 - 21:02 #8
jeg er lidt i tvivl om reglerne, men jeg vil gerne af med points. Så hvis det ellers er i orden med regler osv, så kunne jeg give points til den der svarer på om:

1. det er korrekt at der højst kan være fyrre klausuler (id = [tal]) i en sql streng i access / jetsql

2. det er rigtigt at det ikke er muligt at benytte kommasep tekststrenge i forbindelse m. ANY, ALL, IN og evt. SOME i access / jetsql

det ville sådan set også besvare spørgsmålet; nemlig at det ikke er muligt. En løsning er måske at teste for antallet af tal, hvis over fyrre, så del ved fyrre og kør sql kaldet to gange...
Avatar billede erikjacobsen Ekspert
24. oktober 2003 - 21:15 #9
Regler .. ja sel'fø'li' - men jeg skal ikke have point for en ikke-konstruktiv løsning
Avatar billede hossein Nybegynder
24. oktober 2003 - 21:28 #10
den fejl besked som du har fået betyder at du har ikke valgt, i din sql sætning, den felt som du vil skrive ud eller du har stavet forkert:

ADODB.Fields error '800a0cc1'
ADO could not find the object in the collection corresponding to the name or ordinal reference requested by the application.

har ikke noget med IN.
Avatar billede Slettet bruger
24. oktober 2003 - 21:47 #11
Her er en beskrivelse af begrænsningerne, det ser ud til at det er 40 AND'er man ikke må have http://support.microsoft.com/default.aspx?scid=kb;en-us;125767

Med hensyn til IN så kan den fint bruges med en streng ihvertfald i SQL Server, men som hossein har bemærket så tyder den sidste fejlmeddelelse på at du refererer til et felt som ikke findes.
Avatar billede socle Nybegynder
24. oktober 2003 - 22:03 #12
mange tak for linket, det besvarer jo sådan set spørgsmålet :) Selv om SQL strengen bliver to meter lang, så virker det så alligevel.

mht. IN osv, så tror jeg det skyldes at IN ([SQL streng]) opfattes som en 'virtuel' kolonne (hvis man kan kalde det det). I hvert fald trak jeg ikke på noget der ikke var i orden. Fejlen opstod i øvrigt også når jeg benyttede ANY (27,37).

Skidtet virkede da
  id = ANY (27,37)
blev udskiftet med
  id = 27 OR id = 37
Avatar billede erikjacobsen Ekspert
24. oktober 2003 - 22:06 #13
og du har prøvet  .... where id in (1,2,3,7,9,13)
?
Avatar billede socle Nybegynder
24. oktober 2003 - 22:13 #14
yep, så fik jeg ADODB.Fields error '800a0cc1' fejlen.
Avatar billede erikjacobsen Ekspert
24. oktober 2003 - 22:16 #15
Det undrer mig (os?) - for det virker sædvanligvis udmærket. Kan du vise os koden?
Avatar billede socle Nybegynder
24. oktober 2003 - 22:29 #16
nu bliver det akademisk, jeg har nemlig slettet det igen. øjeblik... [5 minutter gik..] åbenbaring!

ja nu virker det altså. Jeg kan ikke sige hvilken fejl jeg lavede for jeg slette skidtet igen og brugte OR... Jeg kan godt se på koden at der ser mere rigtigt ud nu, men hvor fejlen lå ved jeg ikke. det ser ud til jeg skal have minus point for mine gode idér om virtuelle kolonner osv :)

htm skal vel have de fleste, erik også lidt for at være mere stædig end mig, så i må lige smide nogle svar

tak for det
Avatar billede socle Nybegynder
24. oktober 2003 - 22:45 #17
for lige at klargøre:

nsql = replace("27;37", ";", ",")
set rst=conntemp.execute("SELECT * FROM table WHERE id IN (" & nsql & ")")

virker som det skal.
Avatar billede erikjacobsen Ekspert
25. oktober 2003 - 07:01 #18
(ingen point til mig tak)
Avatar billede htm Nybegynder
25. oktober 2003 - 11:20 #19
OK grunden yil at jeg ikke er stædig er at jeg ikke aner ret meget om asp og slet ikke hvilken sql der forstås og ikke forstås af access.

Men et svar skal du få
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

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