Avatar billede orca Nybegynder
10. august 2002 - 12:50 Der 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?

Mvh Mark
Avatar billede tmceu Praktikant
10. august 2002 - 13:25 #1
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
Avatar billede orca Nybegynder
10. august 2002 - 13:38 #2
Når jeg konverterer den, resulterer det så ikke i at jeg kun får de 8k tegn med? Eller er det kun i Group By at den sammenligner med 8k tegn?

/Mark
Avatar billede orca Nybegynder
10. august 2002 - 13:41 #3
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

Mvh Mark
Avatar billede _just4fun_ Nybegynder
10. august 2002 - 13:45 #4
Hvad vil du bruge Group BY Body for? Kan du ikke bare lave en Count(MessageId) og så group by MessageId ?
Avatar billede orca Nybegynder
10. august 2002 - 13:53 #5
Hvis ikke jeg Group'er de forskellige felter jeg bruger, så får jeg fejlen som jeg nævnte lige før. Det hjælper således ikke at Counte MessageID.
Avatar billede tmceu Praktikant
10. august 2002 - 18:14 #6
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.
Avatar billede tmceu Praktikant
10. august 2002 - 18:15 #7
Og for lige at besvare den første kommentar, så er det kun i GROUP BY at konverteringen laves.
Avatar billede orca Nybegynder
10. august 2002 - 18:46 #8
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?

Mvh Mark
Avatar billede tmceu Praktikant
10. august 2002 - 20:06 #9
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 :-)
Avatar billede orca Nybegynder
11. august 2002 - 00:26 #10
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.

Måske har jeg misfortstået noget helt? :)

Mvh Mark
Avatar billede tmceu Praktikant
11. august 2002 - 01:27 #11
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å.
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