10. august 2002 - 12:50Der er
10 kommentarer og 1 løsning
Problem med datatype
Hej alle. Jeg har en SQL streng som denne:
SELECT *,Count(*) Antal FROM [tblNewsGroupMessages] WHERE [Reference] = '" & MessageID & "' GROUP BY Body, Sender, PostDate, Subject, MessageID, Reference, NewsGroupID, SenderEmail, UserID ORDER BY [PostDate] ASC
Problemet er at jeg får denne fejl:
The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator
Fordi feltet Body er et tekst felt. Body kan sagtens indeholde over 8000 tegn, og jeg kan derfor ikke bruge Varchar.
Hvordan kan jeg komme uden om den fejl? Findes der datatyper som tillader over 8000 tegn, og som virker ligesom text?
Der findes ikke andre datatyper du kan bruge i stedet. Men i GROUP BY sammenhæng, kan det heller ikke gøre den store foskel om der grupperes på mere end 8000 karakterer. Du kan derfor lave en CONVERT til varchar i din GROUP BY som dette:
SELECT *,Count(*) Antal FROM [tblNewsGroupMessages] WHERE [Reference] = '" & MessageID & "' GROUP BY CONVERT(VARCHAR(8000),Body), Sender, PostDate, Subject, MessageID, Reference, NewsGroupID, SenderEmail, UserID ORDER BY [PostDate] ASC
Jeg har lige prøvet Convert. Nu kommer den i stedet med denne fejl:
Column 'tblNewsGroupMessages.Body' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Som også opstår hvis jeg udelukker Body fra min Group By del. Min SQL ser nu således ud:
SELECT *,Count(*) Antal FROM [tblNewsGroupMessages] WHERE [Reference] = '" & MessageID & "' GROUP BY CONVERT(VARCHAR(8000),Body), Sender, PostDate, Subject, MessageID, Reference, NewsGroupID, SenderEmail, UserID ORDER BY [PostDate] ASC
Når du anvender GROUP BY, skal du angive alle ikke-aggregate felter (SUM, COUNT o.s.v.) felter fra kolonne listen i din GROUP BY. Da du laver en SELECT * betyder det at du skal specificere alle felter under GROUP BY.
tmceu -> Såvidt jeg forstår dit svar skal jeg specificere _alle_ mine felter, men hvordan gør jeg det når den brokker sig over Body? Eller har jeg misforstået noget?
Det bedste er ikke at anvende SELECT * når du laver GROUP BY, Men kun at specificere de felter du skal anvende. Altså eks. SELECT Body, Sender, PostDate, Subject o.s.v.
Hvis du påstår at du rent faktisk skal bruge alle felter, giver en GROUP BY ingen mening :-)
tmceu -> Jeg skal faktisk bruge alle felter. Uden Group By vil min sql koden ser således ud:
SELECT *,Count(MessageID) As Antal FROM [tblNewsGroupMessages] WHERE [Reference] = '" & MessageID & "' ORDER BY [PostDate] ASC
Men så får jeg fejlen:
Column 'tblNewsGroupMessages.Sender' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause
Hvilket jeg tolker som at der _skal_ være en group by, for at det kan lade sig gøre, men måske tager jeg fejl? Group By hjælper også på alle felterne pånær Body, som ikke kan virke fordi det er et text felt.
Det er korrekt at du skal specificere GROUP BY, når du anvender SUM, COUNT m.v.. Men din COUNT giver ingen mening når du tager alle felterne med, da GROUP BY således normalt vil "gruppere" alle poster enkeltvis og din COUNT derfor altid vil være 1. Jeg antager at du har en PRIMARY KEY på tabellen og denne vil medvirke at din COUNT altid vil være 1, da alle rækker vil være forskellige, når der grupperes på alle felter.
Men hvis du insisterer er løsningen stadig at du laver den CONVERT jeg viste på Body og så skal du blot sørge for at specificere alle øvrige felter også.
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.