Проверяйте данные перед загрузкой через SSIS - PullRequest
2 голосов
/ 26 мая 2010

У меня есть пакет служб SSIS для загрузки данных из файла Excel в таблицу Sql Server 2005.

Файл Excel будет содержать различные строки данных в диапазоне от 20 до 30 тыс. Строк.

Загрузка работает нормально, когда все данные верны. Но, очевидно, не удается, когда есть небольшая проблема даже в одном ряду. Примеры, такие как обязательные значения, представленные нулем, необратимые значения (несоответствие типов данных) и т. Д.

Я хочу проверить файл Excel перед загрузкой и сообщить пользователю, в какой строке и столбце произошла ошибка ...

Любая идея о том, как этого добиться, не тратя много времени и ресурсов.

Спасибо

Ответы [ 2 ]

2 голосов
/ 26 мая 2010

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

Эта таблица является чрезвычайно универсальной, где все поля NULL способны и VARCHAR(255). Затем у меня есть хранимая процедура проверки, которая проверяет такие вещи, как набор текста, наличие данных и т. Д., Прежде чем переместить данные в «живую» ситуацию. Хотя это может быть не самое элегантное решение, оно дает вам полный контроль над тем, как вы проверяете данные, а также означает, что вам не нужно беспокоиться о преобразовании файла (ов) в .CSV.

2 голосов
/ 26 мая 2010

Возможно, проще всего загрузить временную таблицу, в которой нет обязательных значений и т. Д., И проверить ее перед добавлением в основную таблицу.

РЕДАКТИРОВАТЬ комментарий

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset 

''This is not necessarily the best way to get the workbook name
''that you need
strFile = Workbooks(1).FullName

''Note that if HDR=No, F1,F2 etc are used for column names,
''if HDR=Yes, the names in the first row of the range
''can be used. 
''This is the Jet 4 connection string, you can get more
''here : http://www.connectionstrings.com/excel

 strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile _
    & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"

Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")

cn.Open strCon

''Note that HDR=Yes
''Pick one:
strSQL = "SELECT Frst, Secnd FROM TheRange WHERE SomeField Is Null" ''Named range
strSQL = "SELECT Frst, Secnd FROM [Sheet1$C3:C67] WHERE Val(Secnd)=0" ''Range
strSQL = "SELECT Frst, Secnd FROM [Sheet1$] WHERE First<Date()" ''Sheet

rs.Open strSQL, cn

Sheets("Sheet2").Cells(2, 1).CopyFromRecordset rs
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...