19. oktober 2011 - 10:54Der 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?
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.
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.
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.
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.
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.
#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.
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.
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.
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.