14. januar 2003 - 15:04Der er
15 kommentarer og 2 løsninger
MSDE bulk import datoer
Hejsa
Er det muligt at bulk importere datoer i MSDE/MS SQL ved at benytte det interne dato/tid-format f.eks. 157552308774497 i stedet for standard-formatet f.eks. 2000-06-08 21:43:04. Grunden til at jeg ønsker dette er at det program som skal levere data er meget lang tid om at konvertere til dette datoformat, så jeg ville kunne vinde meget performance ved at skulle lave en mere simpel konvertering. Programmet som leverer tekst-filer til import er skrevet i Progress.
Jeg importerer en mænge meget store tekstfiler med en masse datoer i ved hjælp af bulk copy import metoden i MSDE. Det er ikke et unix timestamp men den måde som en dato blive lagret på internt i MSDE/MS SQL. Jeg ville gerne ha' at man kunne skrive dette tal i tekst-filen og at den så kunne forstå det når det blev læst ind i et datetime felt.
hej rosted... jojo det kan nu snildt lade sig gøre! Jeg vil nok anbefale dig at lave en insert-trigger til formålet og så huske at enable FIRE_TRIGGERS via bcp eller bulk... Tjek BOL, søg på "BULK INSERT" der er nogle switches, led efter FIRE_TRIGGERS :O)
hmm, nu sidder jeg lige og tænker på om du mener ud af SQL og ind i en textfil?
Jeg kan ikke få den til at afvikle min trigger. Jeg har oprettet et bcp objekt, men det har ikke nogen egenskaber som ligner FIRE_TRIGGERS fra det eksempel de refererer til. Nogen idéer?
Jeg kører ikke via kommando prompt. Jeg opretter com objekter med egenskaber, som stort set minder om de argumenter man kan give ved kommando promt, f.eks. Row og Column delimiter, MaximumErrorsBeforeAbort, ImportRowsPerBatch osv. Men jeg kan ikke finde noget der minder om fire_triggers. Jeg skal kunne kalde dette via mit Progress program, så jeg er nødt til at gøre det på denne måde. Men triggers bliver ikke udført når jeg prøver nu. Er det ikke muligt at gøre på denne måde?
Jeg har prøvet at lave det i VB og i Progress. I VB ser det f.eks. sådan ud (hvilket virker men ikke kører nogle triggere):
Dim oDB As SQLDMO.Database Dim oServer As SQLDMO.SQLServer Dim oBCP As SQLDMO.bulkcopy Set oBCP = New SQLDMO.bulkcopy Set oServer = New SQLDMO.SQLServer oServer.Connect "SERVER", "U", "P" oServer.EnableBcp = True Set oDB = oServer.Databases("DB")
With oBCP .DataFilePath = "C:\mappe\fil.txt" .DataFileType = SQLDMODataFile_CommaDelimitedChar .UseBulkCopyOption = True .ImportRowsPerBatch = 10000 .MaximumErrorsBeforeAbort = 2 End With
Dim i As Long i = oDB.Tables("testdt").ImportData(oBCP)
Jeg er ved at undersøge sagen, men jeg må sige, at jeg aldrig har brugt den SQLDMO til bulkcopy! - Når jeg har lavet bulkcopy har jeg altid bare brugt BULK INSERT db.dbo.table FROM 'c:\mybulkfiles.dat' WITH (KEEPNULLS, FORMATFILE = '\myformatfiles\bulk.fmt');
Det giver en fantastisk fleksibilitet, igennem formatfilen :O)
I dit tilfælde vil man typisk lave en conn.execute på det ovennævnte statement, hvor du så bare har erstattet mybulkfiles.dat med fil.txt og lige oprettet en formatfile! - Du behøver egentlig ikke engang at bruge en formatfile hvis du vil importere alle kollonner i text-filen ;O)
Så gør du bare sådan her: BULK INSERT db.dbo.table FROM 'C:\mappe\fil.txt' WITH (KEEPNULLS, FIELDTERMINATOR = ',', ROWTERMINATOR = '\n');
Det gør jeg desvære ikke. Jeg tror ikke jeg kommer videre med det, men her er dine point. Tak for en ihærdig indsats.
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.