locked
BCP в SQL Server 2005 не округляет колонку RRS feed

  • Общие обсуждения

  • ПОВЕДЕНИЕ/СИМПТОМЫ:

    В течение BCP операции в SQL 2005, колонка с меньшей точностью получает ошибки округления. BCP в SQL Server 2000 не сообщал об ошибках округления, которые могли оказать воздействие на бизнес-логику (программный код, реализующий функциональность приложения) в приложениях, где требуется точность данных выше точного десятичного значения. BCP для SQL Server 2005 сообщает об ошибке округления и не будет округлять/отбрасывать данные, предназначенные для вставки, которые могли бы в сложившейся операции импорта привести к сбою, который бы соответствовал использованию старой версии утилиты BCP . Например: Если исходная колонка имеет 7 десятичных разрядов, тогда выходной файл BCP также содержит 7 десятичных разрядов. Когда мы импортируем те записи в таблицу базы данных SQL Server 2005, которая имеет только 3 десятичных разряда, то получаем ранее приведенную ошибку.

    СООБЩЕНИЕ ОБ ОШИБКЕ:

    Starting copy...

    SQLState = 22001, NativeError = 0

    Error = [Microsoft][SQL Native Client]String data, right truncation

    SQLState = 22001, NativeError = 0

    Error = [Microsoft][SQL Native Client]String data, right truncation

    SQLState = 22001, NativeError = 0

    Error = [Microsoft][SQL Native Client]String data, right truncation

     

    1 rows copied.

    Network packet size (bytes): 4096

    Clock Time (ms.) Total : 16 Average : (62.50 rows per sec.)

    ПРИЧИНА:

    SQL 2000 использует ODBC 2.0 и ODBC 2.0 не докладывает об ошибке округления. Так SQL BCP продолжает округлять записи и импортирует их в целевую таблицу.

    SQL 2005 с SP 3 использует ODBC 3.0 и эта версия 3.0 сообщает об ошибке округления, так что SQL 2005 с SP 3 BCP выдает сообщение об ошибке округления и не импортирует недопустимые записи.

    РЕШЕНИЕ/ОБХОД:

    ·  Работая с этой проблемой мы создали другую таблицу с большим количеством десятичных разрядов и использовали BCP для вставки данных в новую таблицу. После этого, используя “ insert into select ” вставили данные в старую таблицу.

    Например , old_table (c1 decimal(4,2)) , new_table (c1 decimal(6,4)), раз BCP в new_table, мы можем сделать “insert into old_table select * from new_table”. Это также округляет/отбрасывает данные так как целевая таблица имеет низкую точность, но этот метод не будет причиной сбоя BCP .

    ·  Мы можем изучить опции расширения целевых колонок или импорта данных с предопределенной шириной колонки. Это более предпочтительно если целевые таблицы могут быть приведены к подгонке данных без потери их при перемещении.

    ШАГИ ДЛЯ КОПИИ

    1.      Создание тестовой таблицы

    create table t_testbcp (line_name varchar(100), amount decimal(15,3))

    2.      Данные в текстовом файле

    <testbcp.txt>

    Line1|1.123

    Line2|1.1234

    Line3|1.12345

    Line4|1.123456

    <testbcp.txt>

    3.      Как у нас переименовать 2 файла, приведенных ниже:

    C:\Program Files\Microsoft SQL Server\80\Tools\binn\bcp.exe

    C:\Program Files\Microsoft SQL Server\80\Tools\binn\Resources\1033\bcp.rll

    4.      Затем выполнить ниже приведенную команду и она вызовет ошибку

    C:\ >"C:\Program Files\Microsoft SQL Server\90\Tools\binn\bcp.exe" backup_test.dbo.t_testbcp in testbcp.txt -S Server\SQLInstance -T -t "|" -E –c

     

    Starting copy...

    SQLState = 22001, NativeError = 0

    Error = [Microsoft][SQL Native Client]String data, right truncation

    SQLState = 22001, NativeError = 0

    Error = [Microsoft][SQL Native Client]String data, right truncation

    SQLState = 22001, NativeError = 0

    Error = [Microsoft][SQL Native Client]String data, right truncation

     

    1 rows copied.

    Network packet size (bytes): 4096

    Clock Time (ms.) Total : 16 Average : (62.50 rows per sec.) 1 строка скопирована

     

    5.       В обхода использование переключателей (параметры командной строки) –с и –n может не помочь.

    Замечание: После того, как результат будет связан с ODBC 3.0 драйвером, использование BCP не поможет зафиксировать результат в нашем случае.


    Для связи [Mail]
    • Перемещено Tagore Bandlamudi 2 октября 2010 г. 0:33 MSDN Forums consolidation (От:SQL Server для разработчиков)
    4 мая 2010 г. 10:14