Avatar billede goose Nybegynder
01. september 2005 - 07:46 Der er 23 kommentarer og
1 løsning

SQL ved brug af MSSQL istedet for Access

Det er nu endelig lykkedes mig at få mit system konverteret til MSSQL database istedet for Access, dog har jeg lige et problem jeg ikke kan få løst.

På en side laver jeg en alfabestisk oversigt over alle siderne på sitet og øverst på denne side har jeg så alfabetet opstillet med hyperlinks til længere nede på siden.

Neden stående kode laver dette alfabet og virker fint hvis jeg bruger Access, men ikke ved MSSQL, der kommer den med følgende fejlbesked:

Microsoft OLE DB Provider for SQL Server error '80040e14'
The isnull function requires 2 arguments.

<KODEN>

SQL = "SELECT distinct left(menupunkt,1) as bogstav FROM (SELECT * from TBL_pages where hovedegenskaber=1 and aktiv=1 and isnull(show_menu) or hovedegenskaber=0 and aktiv=1 and indgang=1 and show_menu='checked' and show_in_sitemap='checked' ORDER BY left(menupunkt,1))"

</KODEN>

Jeg forstår desværre ikke denne fejlbesked ?

/Goose
Avatar billede nielle Nybegynder
01. september 2005 - 08:04 #1
Prøv at rette:

... AND isnull(show_menu) OR ...

- til:

... AND show_menu IS NULL OR ...
Avatar billede goose Nybegynder
01. september 2005 - 08:07 #2
Så får jeg følgende fejl:

Microsoft OLE DB Provider for SQL Server error '80040e14'
The ORDER BY clause is invalid in views, inline functions, derived tables, and subqueries, unless TOP is also specified.

/Goose
Avatar billede nielle Nybegynder
01. september 2005 - 08:12 #3
Så må du vel sætte en TOP på også:

SQL = "
SELECT distinct left(menupunkt,1) AS bogstav FROM
(
SELECT TOP 30 *
FROM TBL_pages
WHERE hovedegenskaber=1
    AND aktiv=1
    AND show_menu IS NULL
    OR hovedegenskaber=0
    AND aktiv=1
    AND indgang=1
    AND show_menu='checked'
    AND show_in_sitemap='checked'
ORDER BY left(menupunkt,1))
"
Avatar billede nielle Nybegynder
01. september 2005 - 08:15 #4
... eller måske sådan her i stedet:

SQL = "
SELECT distinct left(menupunkt,1) AS bogstav FROM
(
SELECT
FROM TBL_pages
WHERE hovedegenskaber=1
    AND aktiv=1
    AND show_menu IS NULL
    OR hovedegenskaber=0
    AND aktiv=1
    AND indgang=1
    AND show_menu='checked'
    AND show_in_sitemap='checked'
)
ORDER BY bogstav
"
Avatar billede nielle Nybegynder
01. september 2005 - 08:19 #5
For lige at vende tilbage til din oprindelige fejlbesked, så skyldes den simpelthen at ISNULL() har ændret mening og formål fra Access til MS SQL:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_ia-iz_6mek.asp

http://www.aspfaq.com/show.asp?id=2532
Avatar billede goose Nybegynder
01. september 2005 - 08:29 #6
Hvis jeg indsætter TOP 30 så kommer følgende fejl:

Microsoft OLE DB Provider for SQL Server error '80040e14'
Line 1: Incorrect syntax near ')'.

Hvis jeg bruger den sidste du sendte, så får jeg følgende fejl:

Microsoft OLE DB Provider for SQL Server error '80040e14'
Incorrect syntax near the keyword 'FROM'.

Jege ved ikke om det kan have noget med * at gøre, f.eks. hvis jeg skal slette noget kan jeg ikke bruge delete * from men skal bruge delete from ?

/Goose
Avatar billede nielle Nybegynder
01. september 2005 - 08:33 #7
Den korrekte syntaks for DELETE bruger aldrig *, hverken i Access, MS SQL ellere andet:

DELETE FROM dinTabel WHERE ditFelt=42

Der er nemlig ingen grund til at have en * idet det er hele rækken som slettes, ikke kun nogle af værdierne i denne.
Avatar billede nielle Nybegynder
01. september 2005 - 08:34 #8
SQL = "
SELECT distinct bogstav FROM
(
SELECT left(menupunkt,1) AS bogstav
FROM TBL_pages
WHERE hovedegenskaber=1
    AND aktiv=1
    AND show_menu IS NULL
    OR hovedegenskaber=0
    AND aktiv=1
    AND indgang=1
    AND show_menu='checked'
    AND show_in_sitemap='checked'
)
ORDER BY bogstav
"
Avatar billede nielle Nybegynder
01. september 2005 - 08:37 #9
... bortset fra det så var det vist mig som kom til at slette *-tegnet ved et uheld - du havde det med fra starten. :^|

Koden i 01/09-2005 08:34:48 er imidlertid noget mere effektiv end at bruge SELECT *.
Avatar billede goose Nybegynder
01. september 2005 - 08:45 #10
hmmm, nu får jeg fejlen:

Microsoft OLE DB Provider for SQL Server error '80040e14'
Incorrect syntax near the keyword 'ORDER'.

- ved koden:

SQL = "SELECT distinct bogstav FROM (SELECT left(menupunkt,1) AS bogstav FROM TBL_pages WHERE hovedegenskaber=1 AND aktiv=1 AND show_menu IS NULL OR hovedegenskaber=0 AND aktiv=1 AND indgang=1 AND show_menu='checked' AND show_in_sitemap='checked')ORDER BY bogstav"

Jeg forstår ikke lige din sidste kommentar, mangler der * i ovenstående SQL ?

/Goose
Avatar billede nielle Nybegynder
01. september 2005 - 08:50 #11
Nej, der mangler netop ikke noget *-tegn; Jeg havde fået fjernet dit oprindelige *-tegn ved et uheld, men lavede så til gengæld en mere effektiv løsning. :^)

Hvad angår fejlen: Prøv lige at sætte et mellemrum ind før ORDER BY.
Avatar billede goose Nybegynder
01. september 2005 - 09:00 #12
okay

Det giver samme fejl med et mellemrum før ORDER :o(

/Goose
Avatar billede goose Nybegynder
01. september 2005 - 09:08 #13
Jeg prøvede lige at fjerne den første distinct sætning således at min SQL nu er:

SQL = "SELECT left(menupunkt,1) AS bogstav FROM TBL_pages WHERE hovedegenskaber=1 AND aktiv=1 AND show_menu IS NULL OR hovedegenskaber=0 AND aktiv=1 AND indgang=1 AND show_menu='checked' AND show_in_sitemap='checked' ORDER BY bogstav"

- og så udskriver den godt nok alfabetet men naturligvis mere end én forekomst af hvert bogstav.

Kan det være distinct der skal erstattes af noget andet ?

/Goose
Avatar billede nielle Nybegynder
01. september 2005 - 09:15 #14
Hvorfor har du slettet parentesrene rundt om den nestede SELECT?
Avatar billede nielle Nybegynder
01. september 2005 - 09:17 #15
Prøv denne her:

SQL = "SELECT DISTINCT bogstav FROM (SELECT left(menupunkt,1) AS bogstav FROM TBL_pages WHERE hovedegenskaber=1 AND aktiv=1 AND show_menu IS NULL OR hovedegenskaber=0 AND aktiv=1 AND indgang=1 AND show_menu='checked' AND show_in_sitemap='checked') ORDER BY bogstav"
Avatar billede goose Nybegynder
01. september 2005 - 09:23 #16
Jeg slettede paranteserne som jeg skrev idet jeg fjernede den først udvælgelse med distinct.

Den SQL fra 09:17:55 er den samme som jeg brugte kl.08:45:16 og giver fejlen:

Microsoft OLE DB Provider for SQL Server error '80040e14'
Incorrect syntax near the keyword 'ORDER'.

/Goose
Avatar billede nielle Nybegynder
01. september 2005 - 09:26 #17
Du gjorde vist lidt mere end bare at slette DISTINCT og parenteser - der var også nogle led som stod andre steder. Derfor måtte jeg lige sikre mig.

Underligt med den fejl-meddelelse, den kan jeg ikke lige greje... Hvordan med deludtrykket:

SELECT left(menupunkt,1) AS bogstav
FROM TBL_pages
WHERE hovedegenskaber=1
    AND aktiv=1
    AND show_menu IS NULL
    OR hovedegenskaber=0
    AND aktiv=1
    AND indgang=1
    AND show_menu='checked'
    AND show_in_sitemap='checked'

Giver det nogen fejl?
Avatar billede nielle Nybegynder
01. september 2005 - 09:32 #18
Prøv denne version - den bruger ikke en nested SQL:

SQL = "SELECT DISTINCT left(menupunkt,1) AS bogstav FROM TBL_pages WHERE hovedegenskaber=1 AND aktiv=1 AND show_menu IS NULL OR hovedegenskaber=0 AND aktiv=1 AND indgang=1 AND show_menu='checked' AND show_in_sitemap='checked' ORDER BY bogstav"
Avatar billede goose Nybegynder
01. september 2005 - 09:32 #19
Nej det giver ingen fejl og heller ikke med ORDER BY bogstav, dog udskriver den mere end én forekomst af hvert bogstav.

Det var netop det jeg prøvede kl. 09:08:18

/Goose
Avatar billede goose Nybegynder
01. september 2005 - 09:34 #20
HALLØJSA - umiddelbart ser det ud til den sidste her virker ....... kan du forklare ?

/Goose
Avatar billede nielle Nybegynder
01. september 2005 - 09:41 #21
Forklare hvad præcist? Umiddelbart burde strukturen i SQL-sætningen være simpel nok:

SQL = "
SELECT DISTINCT left(menupunkt,1) AS bogstav
FROM TBL_pages
WHERE hovedegenskaber=1
    AND aktiv=1
    AND show_menu IS NULL
    OR hovedegenskaber=0
    AND aktiv=1
    AND indgang=1
    AND show_menu='checked'
    AND show_in_sitemap='checked'
ORDER BY bogstav
"
Avatar billede goose Nybegynder
01. september 2005 - 09:48 #22
Du har ret, jeg er nok bare ved at være lidt ør i hovedet :o/

Smid et svar, du har (igen) ydet uvurderlig hjælp, så jeg fordobler lige pointantallet da den vist godt kan kategoriseres som en 200 :o)

/Goose
Avatar billede nielle Nybegynder
01. september 2005 - 09:55 #23
Nej tak. 100 point er fint nok for et spørgsmål af denne sværhedsgrad. Men ellers tak for tilbudet. :^)

... og et svar :^)
Avatar billede goose Nybegynder
01. september 2005 - 09:59 #24
Jamen så bukker og skraber jeg dybt :o)

Tak for hjælpen.

/Goose
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
Kurser inden for grundlæggende programmering

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