Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20
  1. #1

    [sql] BULK INSERT [fixed field]

    ciao a tutti

    sto creando una procedura di importazione manuale in una tabella di sql col comando BULK INSERT.

    nella sintassi presente nel file help di sql (http://msdn.microsoft.com/library/de...ba-bz_4fec.asp) è indicato come dividere le colonne usando il comando FIELDTERMINATOR. il problema è che le mie colonne presenti nel file di testo sono a larghezza fissa, quindi anzichè la divisione standard per tabulazione, punto, virgola, ecc ecc devo dargli dei numeri, tipo la prima colonna inizia al carattere 1 e finisce al 5, la seconda inizia al carattere 6 e finisce al 10 ecc ecc

    c'è modo di farlo?

    grazie!

  2. #2
    Utente di HTML.it L'avatar di comas17
    Registrato dal
    Apr 2002
    Messaggi
    6,523
    Si, devi usare l'opzione FORMATFILE in cui gli indichi un file di esempio (che ha in formato che tu vuoi)
    Guarda questo esempio:


    create a test file C:\test.txt using this simple line of text aaaabbbbccccdddd repeated 2405699 times

    run osql.exe against the sql server and execute this statement on the test database

    create table t( a char(4), B char(4), C char(4), D char(4) )

    then save file C:\test.fmt with the following content:

    8.0
    4
    1 SQLCHAR 0 4 "" 1 a Latin1_General_CI_AI
    2 SQLCHAR 0 4 "" 2 b Latin1_General_CI_AI
    3 SQLCHAR 0 4 "" 3 c Latin1_General_CI_AI
    4 SQLCHAR 0 4 "" 4 d Latin1_General_CI_AI

    and then execute bulk insert statement like this:

    bulk insert t from 'C:\test.txt'
    with ( FORMATFILE = 'C:\test.fmt', BATCHSIZE = 10000 )

    L'ho preso da qui: http://www.experts-exchange.com/Data..._20847182.html

  3. #3
    grazie comas

    allora:

    ho creato una tabella di nome "prova" nel mio database , con 4 colonne char(4) rispettivamente con nome a, b, c, d

    ho creato un file c:\prova.txt con questo contenito

    aaaabbbbccccdddd
    aaaabbbbccccdddd
    aaaabbbbccccdddd
    aaaabbbbccccdddd
    aaaabbbbccccdddd
    aaaabbbbccccdddd
    aaaabbbbccccdddd

    ecc ecc

    ho creato un file test.fmt con questo contenuto

    7.0
    4
    1 SQLCHAR 0 4 "" 1 a Latin1_General_CI_AI
    2 SQLCHAR 0 4 "" 2 b Latin1_General_CI_AI
    3 SQLCHAR 0 4 "" 3 c Latin1_General_CI_AI
    4 SQLCHAR 0 4 "" 4 d Latin1_General_CI_AI

    ho indicato 7.0 all'inizio anzichè 8.0 perchè se no mi dava l'errore unknown format version file o una roba del genere. metendo 7.0 quell'errore non me lo fa (uso sql server 7.0, non 2000 come era indicato nell'esempio)

    poi ho eseguito la seguente stored procedure:

    bulk insert prova
    from 'c:\test.txt'
    with ( formatfile = 'c:\test.fmt', batchsize = 10000 )

    e il sql mi ridà questo errore

    Server: Msg 4823, Level 16, State 1, Line 1
    Could not bulk insert. Invalid column number in format file 'c:\test.fmt'.

    boh quello che posso presumere è che il sql server 7.0 richieda una diversa sintassi nei file .fmt

  4. #4
    Utente di HTML.it L'avatar di comas17
    Registrato dal
    Apr 2002
    Messaggi
    6,523
    Ho trovato questo: http://support.microsoft.com/default...b;EN-US;249119

    ed anche questo, che conferma i tuoi dubbi: http://www.fuzzysoftware.com/newsgro...s&messid=23204


    prova ad usare, come dice il primo link, l'utility 'bcp' invece di bulk insert....

  5. #5
    perfetto, risolto!

    allora era una banalità

    il formato del file .fmt del sql 7.0 l'ho trovato qui

    http://www.schemamania.org/jkl/books...mpt_bcp_16.htm

    ho semplicemente rimosso Latin1_General_CI_AI dopo il nome della colonna nella tabella di sql
    poi mi ha dato ancora errore ma semplicemente non ero andato a capo alla fine del file .fmt


    7.0
    4
    1 SQLCHAR 0 4 "" 1 a
    2 SQLCHAR 0 4 "" 2 b
    3 SQLCHAR 0 4 "" 3 c
    4 SQLCHAR 0 4 "" 4 d


    ginius :metallica

    edito per dire che ho visto ora che mi hai risposto anche tu

    grazie mille dell'attenzione sei stato proprio tu a mettermi nella buona strada

    smak

  6. #6
    ecco, adesso arriva il secondo scoglio: se eseguo la procedura di bulk insert dal server come ho detto funziona alla perfezione, ma se inserisco questa procedura in una pagina asp (anche senza immettergli variabili) questa non funziona, e mi ritorna un messaggio d'errore (access violation o una roba del genere)

    mi serve farla dalla pagina asp perchè la posizione del file da importare deve essere una variabile definita di volta in volta dall'utente utilizzatore.

    ho provato allora a fare una stored procedure sul server che riuscisse a pescare la posizione del file (exempio: c:\cartella\file.txt) da una tabella del sql, ma non riesco.

    ehm sono un po' nella ca**a qualcuno mi può dare una mano?

    grazie

  7. #7
    Utente di HTML.it L'avatar di comas17
    Registrato dal
    Apr 2002
    Messaggi
    6,523
    Purtroppo non so niente di ASP quindi posso provare a darti una mano solo nella parte SQL.
    Cosa vuol dire "non riesco" a creare una stored procedure ?
    Prova a postarne il testo...

  8. #8
    ok grazie mille comas

    la stored procedure è la seguente

    CREATE PROCEDURE [inserimento] AS
    declare @posizione_file varchar(100)
    select @posizione_file = posizionefile from bulktemp
    bulk insert prova
    from @posizione_file
    with ( formatfile = 'c:\test.fmt', batchsize = 10000 )


    allora: bulktemp è una tabella che ha un campo (posizione_file) dove è contenuto il percorso del file

    prova è il nome della tabella dove vado ad inserire i dati presi dal file di testo

    grazie

  9. #9
    Utente di HTML.it L'avatar di comas17
    Registrato dal
    Apr 2002
    Messaggi
    6,523
    Prova a vedere se questo ti può aiutare...http://www.sqlteam.com/item.asp?ItemID=3207

  10. #10
    ho provato a fare così:

    declare @posizione_file varchar(100)
    select @posizione_file = posizionefile from bulktemp
    print @posizione_file
    bulk insert prova
    from '"@posizione_file"'
    with ( formatfile = 'c:\test.fmt', batchsize = 10000 )

    ma mi da questo errore

    c:\test.txt
    Server: Msg 4861, Level 16, State 1, Line 4
    Could not bulk insert because file '"@posizione_file"' could not be opened. Operating system error code 123(The filename, directory name, or volume label syntax is incorrect.).

    boh non riesco a definire la variabile @posizione_file, anche se me la printa in maniera corretta (C:\test.txt)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.