2010-10-13 3 views
1

Hallo All,Процедура загрузки excel в sql-сервер

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

В пользовательском интерфейсе есть условие для загрузки файла 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$]') 

Как только загрузка прошла успешно, я использую логику и удаление всех ненужных records..finally я получит набор записей, которые я перенести в соответствующие таблицы. Наконец, я удалю таблицу temp, которую я использовал для загрузки. Здесь #temp.

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

В прошлый раз, когда у меня была аналогичная проблема, LTRIM не работает над текстовым полем .. Поскольку excel предположил тип данных для поля в таблица #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 ...

EDIT IN QUERY: -

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, поэтому сообщение об ошибке «преобразование выражения Ошибки арифметического переполнения в типе данных даты и времени. Заявление было прекращено

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

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

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

ответ

0

Спасибо за все ваши responses..I обнаружили подвох для этой проблемы, я определил завершена тип данных столбца как 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 

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

1

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

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

Но вы по-прежнему работает в вопрос что Jet имеет место, где он пытается неправильно присвоить типы данных столбцам.Посмотрите, почему это происходит и как обойти его в this SO post.

+0

Спасибо за ур ответ. Но мне нужны записи с Завершено как 00.00.0000 .. Проблема в том, что его не принимающий формат даты и времени для 00.00.0000 – satya

+0

Хорошо, что я обновил, но мне нужно подчеркнуть, что вы должны прочитать другое сообщение, чтобы полностью понять, что такое здесь, вместо того, чтобы просто обойти это. –

+0

Решения, рассмотренные в упомянутой выше статье, выходят за рамки этого (включая внесение изменений в реестр, если вы так смелы). Решение 'CASE' работало для вас? –

2

Что вы описываете, полагается на очень глючную технологию. Вам посчастливилось получить сообщение об ошибке. Во многих случаях он будет молча пропускать некоторые ценности и сообщать об успехах. После сжигания несколько раз, я всегда загружаю такие данные вручную с 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 
          } 
+0

+1, Спасибо за ваш ответ. Я тоже попробую. – satya

Смежные вопросы