Avatar billede angelenglen Nybegynder
19. oktober 2011 - 10:54 Der er 31 kommentarer og
3 løsninger

MS SQL Fejl ved mange updates, men ingen fejlbesked

Jeg har et ASP-script der genererer nogle SQL updates, i stil med:

UPDATE items SET name="abc" WHERE id=1;
UPDATE items SET name="def" WHERE id=2;
UPDATE items SET name="ghi" WHERE id=3;

osv osv - op til omkring 5000 linjer.
- alt samles i en variabel, og executes samlet på én gang.

Når jeg er over ca. 100 linjer fejler - men uden jeg får en fejl - det ligner alting er udført korrekt, det tager også længere tid jo flere linjer jeg har med.

Jeg har også prøvet at sætte en tæller ind, og fyre linjerne af i "batches" af fx 100 eller 500 linjer, den melder stadig ingen fejl, men udfører ikke ændringerne i databasen.

- dvs. det ligner at alt udføres korrekt, men når jeg kigger i databasen, er værdierne ikke updated som de skal være.

Hvis jeg outputter mine linjer på siden, og kopierer dem ind i Microsoft SQL Management Studio og udfører dem derfra, bliver de udført korrekt, og databasen opdateres som den skal.
DVS. det er ikke selve mine update-sætninger den er gal med.

Men jeg får ingen fejl! Jeg forstår det ikke - hvordan kan jeg fejlfinde på den slags?
Avatar billede kalp Novice
19. oktober 2011 - 11:03 #1
Ja, men du har kunne konkludere at det ikke er dit SQL den er gal med og alligevel er det eneste kode du viser 3 linjers SQL:)

Er det klassisk ASP eller ASP.NET du benytter?
og har du sikret dig der overhovedet er en forbindelse igennem til databasen?

Hvis noget kode evt.

Start altid småt.. se at der er forbindelse til databasen.. indsæt en række eller opdater en række og udvid derefter din kode.
Avatar billede Syska Mester
19. oktober 2011 - 11:40 #2
UPDATE items SET name="ghi" WHERE id=3;
er ikke sql ... de bruger single quotes.

Ved ikke med MySql.

Hvorfor bruger du ikke "MERGE" hvis det er MSSQL 2008?

Måske timeout ... hvor lang tid tager din statement om at køre?
Timeout i SSMS er vist nok unlimited.

Er der andre ting du synes vi burde vide om dit setup? Sql version, web server, timeout settings?

Du får helt sikkert en exception eller noget. Men måske noget i system sluger den.

mvh
Avatar billede angelenglen Nybegynder
19. oktober 2011 - 11:50 #3
beklager, skrev " i stedet for ' da jeg skrev dem her, men min pointe var egentligt bare at vise at det var en række updates, og at deres individuelle syntax var korrekt.

Merge - den kender jeg ikke - kan du forklare lidt om hvad den gør, og hvordan jeg bruger den?

- og det er classic ASP, jeg opretter min forbindelse som:

Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "database_dsn","web_user","p@ssw0rd"
Conn.CommandTimeout=300

og udfører SQL'en som:

Conn.execute(SQL)

- og sql er en string-variabel, der indeholder alle disse updates.

CommandTimeout var noget jeg satte på i håb om at løse problemet, men det ændrede ikke noget.
Avatar billede Syska Mester
19. oktober 2011 - 12:12 #4
Men hvor lang tid tager den update ?

Her kan du læse om MERGE: http://technet.microsoft.com/en-us/library/bb510625.aspx

Har aldrig brugt classic ASP, så har ingen ide om hvordan den smider rundt om sig med exception etc.

mvh
Avatar billede angelenglen Nybegynder
19. oktober 2011 - 12:17 #5
Hvis jeg fyrer alle 5000 af, tager det ca. 30-45 sekunder.
Ved 500 tager det få sekunder.
100 er næsten instant.

Har lige kigget lidt på Merge, tror det er overkill.
Avatar billede kalp Novice
19. oktober 2011 - 12:27 #6
prøv lige en af disse SQL connections:
http://www.sqlstrings.com/sql-server-asp-conection.htm

som du kan se angiver de provider/driver og det skal du måske også gøre.

nr. 2 er decideret til MSSQL
Avatar billede kalp Novice
19. oktober 2011 - 12:30 #7
Jeg går ud fra du også lukker din forbindelse efter du har udført din SQL?
Du viser det ikke i dit eksempel, men det skal du også sørge for.
Avatar billede angelenglen Nybegynder
19. oktober 2011 - 12:52 #8
Jeg har prøvet connection nummer to, det ændrede ingenting :-/

Jeg lukker altid forbindelsen, men hvad skulle der ske hvis jeg ikke gjorde?
Linjen der ikke kom med er:
Conn.Close()

Egentligt burde forbindelsen jo dø når IIS har behandlet ASP-scriptet færdigt.
Avatar billede kalp Novice
19. oktober 2011 - 13:01 #9
men så er din forbindelse okay.
Det er nok ikke tilladt at updatere flere rækker via. klassisk ASP på den måde.

kan du ikke benytte UpdateBatch:
http://msdn.microsoft.com/en-us/library/ms808705
Avatar billede angelenglen Nybegynder
19. oktober 2011 - 13:05 #10
Det ér tilladt at køre flere updates på den måde, fx 50 updates går glat igennem.

I bund og grund er jeg efterhånden bare ude efter en måde at finde årsagen til at det fejler - for conn-objektet fejler ikke execute-kommandoen.

Normalt hvis jeg fx har skrevet "SLECT" i stedet for "SELECT" får jeg en fejlbesked, og så stopper ASP scriptet - men her kører det bare videre som om intet var galt.

Eftersom jeg jo ikke får nogen fejl ud i ASP-scriptet, gætter jeg på at fejlfindingen skal fortsætte serverside, men jeg har ingen anelse om hvor jeg skal lede :-/
- der står eksempelvis intet i Windows' event-log.
Avatar billede kalp Novice
19. oktober 2011 - 13:06 #11
Derfor kan man sige at din egen kode også burde fungere hvis du affyre én update statement af gangen.

Ud fra din første kommentar skrev du ikke noget om du har prøvet det, men at du blot lavede mindre grupper.. og det vil ikke fungere.
Avatar billede kalp Novice
19. oktober 2011 - 13:14 #12
Hvis du tror det er server side så kan du se hvad der sker på SQL serveren om ikke andet.
Hvis altså du har SQL management installeret:)
Du kan følge med i præcist hvad der kommer ind på SQL serveren på den måde og evt. se fejl.
Avatar billede Syska Mester
19. oktober 2011 - 13:15 #13
Om MERGE er overkill ... nej, den er netop lavet til dette og er 10000000000000000 gange hurtigere hvis dine Indexes er rigtige.

Jeg har noget hvor jeg laver bacthes af ca. 3-5000 ... og de er nærmest instant. Dvs max 1-2 sek, men det kommer selvf også an på hvad hardware der er bag.

Hvis det ikke fejler ved 500, men fejler ved 5000 ... så ville jeg klart prøve MERGE. Super speed, rimelig syntax når man lige får styr på det.

try it

mvh
Avatar billede Syska Mester
19. oktober 2011 - 13:16 #14
Kalp#
Er det ikke SQL Profiler du tænker på?

Mener det kræver en Dev, Stand eller Enterprise version.
Avatar billede kalp Novice
19. oktober 2011 - 13:23 #15
buzzzz >> yep:) Det er et fantastisk værktøj!
Avatar billede Syska Mester
19. oktober 2011 - 13:28 #16
efprofiler og nhprofiler er også cool, dog koster de penge og i dette tilfælde ikke specielt værdi fulde, da de ikke kan bruges sammen med ASP.

Native SQL går nok også uden om de ORMs, med mindre man kalder ExecuteSql på sin context ... who knows.

mvh
Avatar billede angelenglen Nybegynder
19. oktober 2011 - 14:04 #17
Databasen er en MS SQL 2005 Standard Edition, og har SQL Profiler værktøjet til rådighed.

- har i nogen tips til hvad jeg skal gøre med det? Har aldrig haft det program startet før.
Avatar billede kalp Novice
19. oktober 2011 - 14:29 #18
10min video.. nok mest relevant efter 5min
http://sqlserverpedia.com/wiki/Using_SQL_Server_Profiler

Det som du får med værktøjet er en oversigt over de queries der bliver afviklet på SQL serveren..
Du kan se hvor længe de er om at blive afviklet, men vigtigst er at du kan se præcis hvad ASP sender til din SQL server.

Det kan hjælpe med at afklare om requests fra ASP bliver sendt korrekt til din SQL server.
Avatar billede kalp Novice
19. oktober 2011 - 14:50 #19
prøv lige denne provider i din sql connection: Provider=sqloledb

så vidt jeg kan se er problemet at der er en begrænsning på hvor meget SQL du må proppe ind i Conn.execute(SQL)
og den er måske provider afhængig..

men jeg kan da lige tjekke om ikke man kan overwrite det..
Avatar billede kalp Novice
19. oktober 2011 - 15:26 #20
jeg kan ikke rigtig finde noget om hvordan man skal overskrive det - hvis man kan.
Folk har bla. løst det ved at lave en loop.

Men en begrænsning på hvor lang den SQL må være er der i hvert fald.
Avatar billede angelenglen Nybegynder
19. oktober 2011 - 16:50 #21
Ok, det med at der er en begrænsning på SQL'ens længde giver god mening - jeg har dog søgt efter dokumentation for det, men kan ikke finde det.

Har du nogen anelse om hvor den grænse ligger?
- for det kunne sagtens være årsagen til mine problemer.
Avatar billede angelenglen Nybegynder
19. oktober 2011 - 16:50 #22
Ps. du har rigeligt fortjent nogle points, så du må meget gerne lægge et svar, så du kan få når jeg deler points ud :-)
Avatar billede Syska Mester
19. oktober 2011 - 16:58 #23
#angelenglen
Siden du har prøvet SQL Profiler ... hvordan ser den sql sætning, så ud som du kan se via SQL Profiler. den burde jo vise en sætning som er blevet forkortet hvis det er tilfældet.

Måske begrænsningen er i ASP delen og ikke MSSQL. Jeg sender vel ca. 2MB SQL filer fra .NET til MSSQL uden problemer.

mvh
Avatar billede HenrikSjang Nybegynder
19. oktober 2011 - 19:17 #24
Det er meget fint at du sætter command timeout, for det vil også være nødvendigt hvis querien tager mere end 30 sekunder (som jeg mener er default). Men så kunne det meget vel tænkes, at du render ind i ScriptTimeout på selve asp-siden i stedet. Den kan du sætte lidt højere med:

Server.ScriptTimeout = 300

Har du nogle "on error resume next" i din asp kode? For så vil en eventuel fejl nemlig blive slugt. Hvis det er tilfældet, så start med at udkommenter den linje, og se så om du får fejlen vist.

Sidste input: Ifølge http://msdn.microsoft.com/en-us/library/ms143432%28v=SQL.90%29.aspx er max batch size = 65.536 * network packet size. Som note på siden står der, at default er 4KB. Dvs, at din batch max må fylde ca. 256KB. Hvis du har 5000 update linjer, med hver ca. 40 tegn - så er du jo allered på 200KB.. Så hvis dine update linjer bare er lidt længere end de eksempler du viste, så kan det være det problem du render ind i. Men så er jeg 99,9% sikker på, at du ville få en fejl smidt tilbage i hovedet - altså med mindre den bliver slugt med en "on error resume next" som førnævnt.

/Sjang
Avatar billede Syska Mester
19. oktober 2011 - 19:22 #25
Håber ikke han har error handeling. Det er i hvert fald blevet nævnt flere gang. Men det kan selvfølgelig være druknet i andre ting.
Avatar billede kalp Novice
20. oktober 2011 - 01:06 #26
buzzz begrænsningen er i ASP delen kan man jo sige.. eller rettere i den provider/driver han benytter til at forbinde med.
Avatar billede angelenglen Nybegynder
20. oktober 2011 - 10:53 #27
Sjang: Det lyder meget rigtigt, passer også meget godt med antal linjer jeg kunne nå at fyre af før det gik galt.

Jeg fik dog ingen fejl, og havde ingen "on error resume next".

Du må gerne lægge et svar, så jeg kan dele points ud :-)
Avatar billede Syska Mester
20. oktober 2011 - 11:13 #28
Men har du set hvad du modtager på SQL Serveren med SQL Profiler når det går galt?
Avatar billede angelenglen Nybegynder
20. oktober 2011 - 11:19 #29
Ja, den modtager en hel række update-statements, og den sidste på listen er ikke komplet, og er ikke den sidste af dem jeg sender afsted fra ASP-scriptet.

- det tolker jeg som om at jeg sender for meget data afsted, og den derfor fejler.

Hvorfor den ikke kommer med en fejlbesked, det forstår jeg dog stadig ikke.
Avatar billede Syska Mester
20. oktober 2011 - 12:27 #30
Super ... så fik vi da det på det rene, og så er der ingen tvivl om det er den driver du bruger som fucker op :-)

mvh
Avatar billede angelenglen Nybegynder
21. oktober 2011 - 11:00 #31
Jeg lader lige spørgsmålet stå åbent lidt, så Sjang har en chance for at lægge et svar.
Avatar billede HenrikSjang Nybegynder
21. oktober 2011 - 15:56 #32
Kommer her :)
Avatar billede angelenglen Nybegynder
21. oktober 2011 - 18:42 #33
Hov, opdagede lige at jeg mangler et svar fra buzzzz :-)
Vil gerne give dig lidt points også :-D
Avatar billede Syska Mester
21. oktober 2011 - 19:29 #34
svar
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