28. december 2000 - 14:13Der 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
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\"
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..
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ø
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..
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.
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.. :)
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
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.
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.