Процедура загрузки Excel в SQL Server - PullRequest
1 голос
/ 13 октября 2010

Hallo All,

Помогите, пожалуйста, определить наилучшую процедуру для следующей проблемы.

В пользовательском интерфейсе есть положение для загрузки файла Excel.Это делается администратором, один / два раза в день на регулярной основе.

Код, который я использовал для загрузки файла excel на сервер sql.

select * 
into #temp FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
    'Excel 8.0;Database=D:\Files\29.09.10\working_290910.xls;HDR=YES;IMEX=1', 
    'SELECT * FROM [2XX$]')

После загрузкиуспешно, я использую логику и удаляю все ненужные записи .. наконец я получу набор записей, которые я перемещу в соответствующие таблицы.Наконец, я УДАЛИТЬ временную таблицу, которую я использовал для загрузки.Здесь # temp.

Эта процедура имеет много проблем.Поскольку структура #temp не всегда совпадает с тем, что Excel предполагает тип данных этого конкретного поля на основе анализа данных, которые он имеет в первых n записях.Иногда для определенного поля предполагается тип данных nvarchar (255) и несколько раз текст.Так мало функций выдают сообщение об ошибке в этих конкретных полях при выполнении хранимой процедурыполе в таблице #temp как текст ..

Поэтому я изменил код таким образом, создав таблицу,

CREATE TABLE temp_invoice(
    [Concession Number] varchar(30),
    [Status] char(10),
    [Sort] char(10),
    [Task code text] varchar(60),
    [Task resp#] varchar(10),
    [Person who complete the task] varchar(50),
    [Completed] datetime
) 

, чтобы я мог исправить типы данных и затем переместить данныеиз Excel ...

РЕДАКТИРОВАТЬ В ЗАПРОСЕ: -

insert into temp(Completed)  
    SELECT CASE Completed when '00.00.0000' THEN null else Completed END  
       FROM OPENROWSET  
('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=D:\Files\12.10.10\MC01_PCTA00012_20101012.xls;HDR=YES;IMEX=1', 'select * from [Tabelle1$]') AS A;

Теперь у меня появляется сообщение об ошибке на основе данных.Если в первых нескольких строках заполненное поле имеет значение «00,00 000».Тогда это работает нормально.Если у него нет значения в первых нескольких строках, выдается сообщение об ошибке.

Теперь в моем файле Excel данные для поля [Завершено] - 00.00.0000, поэтому сообщение об ошибке - " Ошибка арифметического переполнения при преобразовании выражения в типе данных datetime. Оператор был прекращен ."

Если я удаляю записи с датой 00.00.0000, то это исправно.Но я не могу делать это вручную каждый раз.Теперь мне нужно найти способ обойти эту проблему.

большое спасибо за ваше терпение при чтении такой длинной почты ... Я действительно не знаю, правильная ли процедура, которую я использую, или нет.Я просто изменяю код для устранения ошибок ...

Пожалуйста, предложите мне соответствующую процедуру для такого рода требований.

Ответы [ 3 ]

2 голосов
/ 13 октября 2010

То, что вы описываете, опирается на очень ошибочную технологию. Вам вообще повезло получить сообщение об ошибке. Во многих случаях он пропускает некоторые значения и сообщает об успехе. После нескольких сожжений я всегда загружаю такие данные вручную из C #. Откройте свою таблицу следующим образом:

    ApplicationClass excelApp = new ApplicationClass();
    string workbookPath = string.Format(@"C:\yourfile.xls");
    Workbook workbook = excelApp.Workbooks.Open(lots of parameters here);

    Sheets sheets = workbook.Sheets;
    Worksheet UsSheet = (Worksheet)sheets.get_Item("US");

Проложите свой путь через клетки так:

                        Range rowrange = UsSheet.get_Range("A3", "A102");
                        System.Array values = (System.Array) rowrange.Cells.Value2;
                        foreach (object value in values)
                            if (value != null)
                            {
                                string s = value.ToString();
                                //do something here
                            }
1 голос
/ 13 октября 2010

Ну, я думаю, вы могли бы изменить свой запрос на выборку на это, если вы позволите Completed быть обнуляемым, что вы должны сделать исходя из описанной проблемы:

SELECT *,
       CASE {Completed Column name}
         when 00.00.0000 THEN null
         else {Completed Column name}
       END
FROM [2XX$]

Но вы все еще работаетев проблему, которую Jet имеет, где он пытается неправильно назначить типы данных для столбцов.Посмотрите, почему это происходит и как обойти это в этом посте .

0 голосов
/ 13 октября 2010

Спасибо за все ваши ответы. Я нашел грязную уловку для проблемы, я определил заполненный тип данных столбца как varchar (20). Загрузка как есть ..

CREATE TABLE temp_invoice(
    [Concession Number] varchar(30),
    [Status] char(10),
    [Sort] char(10),
    [Task code text] varchar(60),
    [Task resp#] varchar(10),
    [Person who complete the task] varchar(50),
    [Completed] varchar(20)
) 

INSERT INTO temp_invoice ([Concession Number],[Status],[Sort],[Task code text],[Task resp#],[Person who complete the task],[Completed])
EXEC('SELECT A.[Concession Number],A.[Status],A.[Sort],A.[Task code text],LTRIM(str(A.[Task resp#],10,0)) as [Task resp#],
A.[Person who complete the task], A.[Completed] 
FROM OPENROWSET  
(''Microsoft.Jet.OLEDB.4.0'',''Excel 8.0;Database=' + 'D:\Files\12.10.10\XCTH00759_20101012.xls' + ';HDR=YES;IMEX=1'','+'''select * from [Tabelle1$]'') AS A') ;

После загрузки я устанавливаю значение в ПУСТО (NULL), если оно завершено со значением '00 .00.0000 '. Затем, наконец, измените тип данных.

UPDATE temp_invoice SET Completed = NULL
where Completed = '00.00.0000'

ALTER TABLE temp_invoice ALTER COLUMN Completed datetime

Потому что все другие способы терпят неудачу на этапе, основанном на данных ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...