none
bulk insert work not correct RRS feed

  • Вопрос

  • i have data-file with 12 fields and ";" is field terminator.

    but in data-file in some rows last fileds can absent.

    when i use "bulk insert" to insert to my table in DB by used format file where all fields described, some rows (one with absent fields and next one)  are inserted in the same row (into last fields).

    for example

    data-file

    1_1;2_1;3_1;;;;6_1;;;9_1

    1_2;2_2;3_2;4_2;5_2;6_2;7_2;8_2;9_2;10_2;11_2;12_2

    1_3;2_3;3_3;4_3;5_3;6_3;7_3;8_3;9_3;10_3;11_3;12_3

    in table

    1_1;2_1;3_1;;;;6_1;;;9_1(there are row terminator symbols) 1_2;2_2;3_2;(4_2;5_2;6_2;7_2;8_2;9_2;10_2;11_2;12_2) - these are in one field

    1_3;2_3;3_3;4_3;5_3;6_3;7_3;8_3;9_3;10_3;11_3;12_3 - next row in table is normal


    how i can decide this?

    8 октября 2010 г. 7:29

Ответы

  • TextFile:

    1_1;2_1;3_1;;;6_1;;;9_1;;;
    1_2;2_2;3_2;4_2;5_2;6_2;7_2;8_2;9_2;10_2;11_2;12_2
    1_3;2_3;3_3;4_3;5_3;6_3;7_3;8_3;9_3;10_3;11_3;12_3
    

     

    use tempdb
    go
    
    create table TT ( field1 char(5) 
             , field2 char(5)
             , field3 char(5)
             , field4 char(5)
             , field5 char(5)
             , field6 char(5)
             , field7 char(5)
             , field8 char(5)
             , field9 char(5)
             , field10 char(5) 
             , field11 char(5) 
             , field12 char(5)
             )
    go
    bulk insert TT
       from 'c:\1.txt'
      with 
       (
         fieldterminator =';',
         rowterminator ='\n'
       )
    go
    select * from TT 
    go
    drop table TT 
    go
    

    result:

    field1 field2 field3 field4 field5 field6 field7 field8 field9 field10 field11 field12
    ------ ------ ------ ------ ------ ------ ------ ------ ------ ------- ------- -------
    1_1  2_1  3_1  NULL  NULL  6_1  NULL  NULL  9_1  NULL  NULL  NULL
    1_2  2_2  3_2  4_2  5_2  6_2  7_2  8_2  9_2  10_2  11_2  12_2 
    1_3  2_3  3_3  4_3  5_3  6_3  7_3  8_3  9_3  10_3  11_3  12_3 

    http://www.t-sql.ru
    8 октября 2010 г. 8:01
    Отвечающий
  • Алексей, спасибо за ответ.

    Но дело в том, что переделывать файлы с данными (т.е. добавлять в конце каждой строки нужное кол-во ";") - дело трудоемкое, ибо их за сутки бывает до тысячи и в каждом из них до сотни тысяч записей. Так что Ваш вариант не эффективен в данной ситуации.


    Файл должен быть строго структурирован, чтоб результат вставки был гарантирован, парсите его предварительно программно и дописывайте до нужной структуры
    http://www.t-sql.ru
    8 октября 2010 г. 8:32
    Отвечающий

Все ответы

  • TextFile:

    1_1;2_1;3_1;;;6_1;;;9_1;;;
    1_2;2_2;3_2;4_2;5_2;6_2;7_2;8_2;9_2;10_2;11_2;12_2
    1_3;2_3;3_3;4_3;5_3;6_3;7_3;8_3;9_3;10_3;11_3;12_3
    

     

    use tempdb
    go
    
    create table TT ( field1 char(5) 
             , field2 char(5)
             , field3 char(5)
             , field4 char(5)
             , field5 char(5)
             , field6 char(5)
             , field7 char(5)
             , field8 char(5)
             , field9 char(5)
             , field10 char(5) 
             , field11 char(5) 
             , field12 char(5)
             )
    go
    bulk insert TT
       from 'c:\1.txt'
      with 
       (
         fieldterminator =';',
         rowterminator ='\n'
       )
    go
    select * from TT 
    go
    drop table TT 
    go
    

    result:

    field1 field2 field3 field4 field5 field6 field7 field8 field9 field10 field11 field12
    ------ ------ ------ ------ ------ ------ ------ ------ ------ ------- ------- -------
    1_1  2_1  3_1  NULL  NULL  6_1  NULL  NULL  9_1  NULL  NULL  NULL
    1_2  2_2  3_2  4_2  5_2  6_2  7_2  8_2  9_2  10_2  11_2  12_2 
    1_3  2_3  3_3  4_3  5_3  6_3  7_3  8_3  9_3  10_3  11_3  12_3 

    http://www.t-sql.ru
    8 октября 2010 г. 8:01
    Отвечающий
  • Алексей, спасибо за ответ.

    Но дело в том, что переделывать файлы с данными (т.е. добавлять в конце каждой строки нужное кол-во ";") - дело трудоемкое, ибо их за сутки бывает до тысячи и в каждом из них до сотни тысяч записей. Так что Ваш вариант не эффективен в данной ситуации.

    8 октября 2010 г. 8:17
  • у меня пока такое решение - создать в таблице вычисляемые поля, в которые заносить результаты работы над последнем полем, содержащем в себе несколько полей, используя различные строковые функции, как patindex и substring.
    8 октября 2010 г. 8:20
  • Алексей, спасибо за ответ.

    Но дело в том, что переделывать файлы с данными (т.е. добавлять в конце каждой строки нужное кол-во ";") - дело трудоемкое, ибо их за сутки бывает до тысячи и в каждом из них до сотни тысяч записей. Так что Ваш вариант не эффективен в данной ситуации.


    Файл должен быть строго структурирован, чтоб результат вставки был гарантирован, парсите его предварительно программно и дописывайте до нужной структуры
    http://www.t-sql.ru
    8 октября 2010 г. 8:32
    Отвечающий
  • я надеялся, что есть какая-то опция, которая сначала ищет именно конец строки в файле с данными, а только потом уже проверяет наличие признака конца поля. а сейчас по определению получается, что bulk ищет признак конца поля, и только потом признак конца строки.
    8 октября 2010 г. 8:41