Avatar billede mssql Nybegynder
28. december 2000 - 14:13 Der er 18 kommentarer og
1 løsning

Underlig SQL fejl ved Alter Table

Jeg har checket at tabellen \"liste33\" findes og at den indeholder feltet \"Test_felt\".

Der kommer en fejl når jeg siger:
DataConn.Execute(\"ALTER TABLE liste33 DROP COLUMN Test_felt\")

Fejlen ser sådan her ud:
Microsoft OLE DB Provider for ODBC Drivers error \'80040e14\'

[Microsoft][ODBC SQL Server Driver][SQL Server]The total row size (17606) for table \'liste33\' exceeds the maximum number of bytes per row (8060). Rows that exceed the maximum number of bytes will not be added.

/admin/xxx.asp, line 60


-Mit/mine spørgsmål:
- Hvorfor kommer fejlen
- Hvordan undgår jeg fejlen
Avatar billede smurfen Nybegynder
28. december 2000 - 19:35 #1
Det ser meget mærkeligt ud..
kan du ikke paste en
sp_help liste33

her..
så vil jeg gerne hjælpe

bare så jeg kan få styr på de felter der er i liste33
Avatar billede mssql Nybegynder
28. december 2000 - 19:57 #2
Nu er jeg ikke lige ved serveren - men jeg tror måske det kan have noget med feltets default værdi at gøre?

Navn: Test_felt
Datatype: int
Default value: 0

Jeg håber dette måske kan hjælpe dig lidt på vej?
Avatar billede smurfen Nybegynder
28. december 2000 - 20:13 #3
Prøv at droppe den constraint du har lavet med default valuen først, og så bagefter colonnen..
Avatar billede mssql Nybegynder
28. december 2000 - 20:28 #4
dvs. \"Alter table liste33 column Test_felt drop default\"???
Avatar billede smurfen Nybegynder
28. december 2000 - 20:34 #5
nope.. jeg har siddet og nulret lidt med det.. og det kan ikke være fejlen.. er der flere columns i det table?
Avatar billede mssql Nybegynder
28. december 2000 - 20:38 #6
ja, men det skulle ikke give problemer.

Her er hvilke felter tabellen indeholder:
efternavn Tekst-felt
email Tekst-felt
fornavn Tekst-felt
historie Tekst-felt
ID Tal-felt
mailgruppe Tekst-felt
oprettet Dato/klokkeslet-felt
rettet Dato/klokkeslet-felt
sendt Dato/klokkeslet-felt
slettet Dato/klokkeslet-felt
status Tal-felt
status Tal-felt
Test_felt Tal-felt

-Hvor:
Tal-felter altid er \"int\"
Dato/klokkeslet-felt altid er \"smalldatetime\"
Tekst-felt altid er \"nvarchar\"

Avatar billede smurfen Nybegynder
28. december 2000 - 20:40 #7
er nvarchar et textfelt? altså hvis det var en access-database ville det være et memo-felt.. det kan være problemet...
Avatar billede mssql Nybegynder
28. december 2000 - 20:43 #8
nja

er du sikker på nvarchar ikke sagtens kan bruges som et text felt - og hvad mener du denne forskel skulle gøre ved drop column af typen int?
Avatar billede smurfen Nybegynder
28. december 2000 - 20:50 #9
Problemet for mig at se er at der er en stor klump data en en af Test_Felt rowsne

og da nvarchar let har alt for meget data kan det være problemet..

F.eks.

Er efternavn af typen nvarchar eller typen varchar(30)

det er dårlig database-brug at bruge nvarchar til det hele..
prøv at ændre dem alle til varchar(30) og se hvad der så sker..
eller bedre lav en ny tabel til det..
Avatar billede mssql Nybegynder
28. december 2000 - 20:52 #10
har de så en begrænsning på 30 karrekter hver?
Avatar billede smurfen Nybegynder
28. december 2000 - 20:58 #11
Jeps
men det tal kan snildt ændres..
f.eks.


VARCHAR(1000)
kan også lade sig gøre..
men hvis alt er ntext felter.. så er det HELT sikkert det der er problemet..
prøv at lave en tabel med kun ntext felter og prop noget ind i dem og forsøg at droppe det..

hvis samme fejl kommer er problemet i og for sig løst..

men lad være med at bruge ntext felter.. det er noget hø
Avatar billede mssql Nybegynder
28. december 2000 - 21:00 #12
jamen det er man da nød til ved meget store data samlinger er man ikke.

Hvis man eksempeltvis gemmer hele sider i en tabel, på mange tussind tegn - hvad ville du så bruge?
Avatar billede smurfen Nybegynder
28. december 2000 - 21:02 #13
hmm

Hvis du har et felt der hedder:
Min_Livshistorie
ville jeg MÅSKE overveje at lave det til et ntext-felt..
MEN varchar og char kan klare op til 8000 tegn i et felt.. det er meget..
ca 2 a4 sider eller noget..
så spørg lige dig selv.. hvor meget data skal der egentlig stå her..
Avatar billede mssql Nybegynder
28. december 2000 - 21:05 #14
ok.... men til alt andet ville du vælge varchar. Det er sjovt for jeg troede nvarchar var så smart at den altid kun lige brugte den data der er brug for mens den anden altid bruger f.eks. 30 tegn.
Avatar billede smurfen Nybegynder
28. december 2000 - 21:07 #15
Nope.. nvarchar er superdårlig fordi databasen (i hvert fald mssql) lagrer dataen et helt andet sted end der hvor den lagrer det tilhørende recordset..

Det betyder at der opstår en masse problemer i den sammenhæng med hensyn til ramforbrug, cpuforbrug, og alt muligt andet der gør det lamt.. :)
Avatar billede mssql Nybegynder
28. december 2000 - 21:08 #16
nå for søren.... der er vidst en der skal have kikket database strukturen igennem....

Jeg prøver lige det hele af i morgen så skal du nok få dine point - hvis det virker ;-)

-Tak for hjælpen!
Avatar billede smurfen Nybegynder
28. december 2000 - 21:11 #17
Np.. ellers så smid lige noget her.. så skal jeg være der..
Avatar billede mssql Nybegynder
30. december 2000 - 17:03 #18
Det virker ikke ;-((

Her er de felter jeg har:

NAVN        type        længde
========================================
id        int        4       
status        int        4
email        varchar        250
oprettet    datetime    8
slettet        datetime    8
sendt        datetime    8
historie    varchar        4000
mailgruppe    varchar        4000
rettet        datetime    8
fornavn        varchar        255
efternavn    varchar        255
test_felt    int        4
Avatar billede mssql Nybegynder
31. december 2000 - 10:35 #19
Ok - nu kan jeg sige at det 100% sikkert ikke har noget med tekst feltet at gøre. Men jeg har ændret typen til varchar, da jeg kan forstå at det genneralt er det bedste.

Her er hvad der sker:
1) Oprettelse af tabellen
DataConn.Execute(\"CREATE TABLE liste33(ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,html INT NOT NULL default(0),status int NOT NULL,email varchar(255) NOT NULL,oprettet datetime,slettet datetime,sendt datetime,historie varchar(4000),mailgruppe varchar(4000),rettet datetime,fornavn varchar(255),efternavn varchar(255))\")

-OK - ingen fejl

2) Tilfølejlse af nye felter uden default værdier:
DataConn.Execute(\"ALTER TABLE liste33 add talfelt_1 int)
-OK - ingen fejl
DataConn.Execute(\"ALTER TABLE liste33 add talfelt_2 int)
-OK - ingen fejl
DataConn.Execute(\"ALTER TABLE liste33 add talfelt_3 int)
-OK - ingen fejl
DataConn.Execute(\"ALTER TABLE liste33 add talfelt_5 int)
-OK - ingen fejl

3) Tilfølejlse af et nyt felt med default værdier:
DataConn.Execute(\"ALTER TABLE liste33 add talfelt_4 int default(0)\")
-OK - ingen fejl


4) Slet et par felter (Bemærk at tabellen ikke indeholder nogen poster)
DataConn.Execute(\"ALTER TABLE liste33 DROP COLUMN talfelt_1\")
-OK - ingen fejl
DataConn.Execute(\"ALTER TABLE liste33 DROP COLUMN talfelt_2\")
-OK - ingen fejl
DataConn.Execute(\"ALTER TABLE liste33 DROP COLUMN talfelt_3\")
-OK - ingen fejl
DataConn.Execute(\"ALTER TABLE liste33 DROP COLUMN talfelt_4\")
Fejl:
Microsoft OLE DB Provider for ODBC Drivers error \'80040e14\'

[Microsoft][ODBC SQL Server Driver][SQL Server]The total row size (8866) for table \'liste33\' exceeds the maximum number of bytes per row (8060). Rows that exceed the maximum number of bytes will not be added.


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