Avatar billede raos Nybegynder
07. oktober 2003 - 15:14 Der er 18 kommentarer og
1 løsning

Problem med at SQL'en ikke bliver kørt

følgende ligger i en vbs fil og køres mod en MSSQL 2K

-----------------------------------------

Set oSiteConn = CreateObject("ADODB.Connection")

sConnString = "driver=SQL server; server=" & sServer & "; uid=" & sUser & "; pwd=" & sPassword & ";database=mydb"
oSiteConn.Open sConnString
oSiteConn.Execute (sSql)
oSiteConn.Close

-----------------------------------------

sSql inderholder:
--------------
delete from mytable;
insert into my table (navn,nummer) VALUES('xxxx',23)
insert into my table (navn,nummer) VALUES('xrxxx',233)
insert into my table (navn,nummer) VALUES('x1xx',21)
insert into my table (navn,nummer) VALUES('xxx6',26)
osv
---------------

mere end 500 insert statements. Men kun ca 400 af dem bliver indsat resten bliver bare ignoreret af SQL serveren. Og det selvom jeg kan se i MS Profiler at alle 500 linier er sendt til SqlServeren.
Scriptet melder ikke fefl eller noget  - undlader bare at indsætte resten. Hvis jeg laver navnene lidt længre i første par inserts bliver endnu færrer poster indsat.
Hvad kan problemet være?
Avatar billede bennytordrup Nybegynder
07. oktober 2003 - 15:35 #1
Løber du ind i begrænsninger på længden af sSql?
Avatar billede bennytordrup Nybegynder
07. oktober 2003 - 15:35 #2
Prøv evt. at dele sSql op i nogle mindre portioner og kør disse en efter en.
Avatar billede arne_v Ekspert
07. oktober 2003 - 15:36 #3
Kan MS SQL udføre mange SQL sætninger i et execute kald ?
Avatar billede arne_v Ekspert
07. oktober 2003 - 15:37 #4
(jeg formoder at det er en typo at der mangler semikolon i linierne i spørgsmålet)
Avatar billede bennytordrup Nybegynder
07. oktober 2003 - 15:37 #5
arne_v >> Det burde ikke være noget problem. Jeg udfører DDL scripts med flere create/alter table i samme script.
Avatar billede arne_v Ekspert
07. oktober 2003 - 15:39 #6
I en ADO connection execute ?
Avatar billede bennytordrup Nybegynder
07. oktober 2003 - 15:40 #7
Yes
Avatar billede raos Nybegynder
07. oktober 2003 - 15:40 #8
benny>> ja man kan jo bare dele det op - men det er ikke en brugbar løsning i dettet tilfælde
Avatar billede bennytordrup Nybegynder
07. oktober 2003 - 15:41 #9
Hvorfor?
Avatar billede raos Nybegynder
07. oktober 2003 - 15:41 #10
men det underligste er at MSSQL eller ADO ikke fejler !!
Avatar billede bennytordrup Nybegynder
07. oktober 2003 - 15:42 #11
arne_v >> Der er nogle statements, som kræver at være først statement i et batch. Det er f.eks. create procedure.

create table og alter table er ligeglad. Det er insert også.
Avatar billede raos Nybegynder
07. oktober 2003 - 15:47 #12
Prøv selv at lave en table med navnet TABEL1 der har én kolonne "text" af typen nvarchar(4000). Og kør følgende script på den:
-----------------------
    ssql = "delete from table1 " & vbCrLf
   
    For i = 1 To 1000
        ssql = ssql & "insert into table1 (text) values ('hfdjsahfj dsafhsa fhdsjkfhdsfd sfhdajf hdjsaf')"
    Next
   
    Set oSiteConn = CreateObject("ADODB.Connection")
    sServer = "dddd"
    suser = "ddddd"
    sPassword = "ddddd"
    sConnString = "driver=SQL server; server=" & sServer & "; uid=" & suser & "; pwd=" & sPassword & ";database=sw3db_34businessfull"
    oSiteConn.Open sConnString
    oSiteConn.Execute (ssql)

    oSiteConn.Close

-------------------------------

tæl så efterfølgende hvor mange poster der er i tabellen
Avatar billede bennytordrup Nybegynder
07. oktober 2003 - 16:09 #13
454.

Jeg kan godt se dit problem. Jeg kan dog ikke se hvorfor, du ikke kan dele din SQL op.
Avatar billede raos Nybegynder
07. oktober 2003 - 16:12 #14
korrekt jeg får også 454 indsat. Hvilken grænse er det man støder på?

opspiltningen kan opså blive løsningen, men det vil være MEGET bedre om vi kunne løse det på den anden måde...
Avatar billede arne_v Ekspert
07. oktober 2003 - 16:15 #15
Hvorfor ikke være lidt konservativ og sige 1 SQL sætning per Execute
og evt. bundle dem i en enkelt transaktion hgis det skulle være påkrævet ?
Avatar billede bennytordrup Nybegynder
07. oktober 2003 - 16:15 #16
Prøv at ændre din connectionstring:

    Set oSiteConn = CreateObject("ADODB.Connection")
    sServer = "dddd"
    suser = "dddd"
    sPassword = "dddddd"
    sConnString = "provider=sqloledb.1;user id=" & suser & ";initial catalog=sw3db_34businessfull;data source=" & sserver & ";extended properties=""PWD=" & spassword & """"
    oSiteConn.Open sConnString
    oSiteConn.Execute (ssql)
Avatar billede bennytordrup Nybegynder
07. oktober 2003 - 16:16 #17
Den løsning giver mig 1000 poster efterfølgende.

Jeg tror, at begrænsningen ligger i hvor meget, ODBC provideren kan håndtere. SQLOLEDB.1 er en OLE DB provider skrevet direkte til SQL Server.

Hvis du ikke bruger SQL Server 2000, skal du bruge providredn sqloledb
Avatar billede raos Nybegynder
07. oktober 2003 - 16:28 #18
Benny du er en helt - det løst jo problemet at bruge OLEDB istedet.
Avatar billede bennytordrup Nybegynder
07. oktober 2003 - 16:29 #19
Lyder godt.
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