Служба SSIS прочитайте таблицу Excel и сгенерируйте число и вставьте его в базу данных - PullRequest
0 голосов
/ 26 августа 2011

Привет, все, что у меня есть для решения проблемы загрузки электронной таблицы Excel с использованием ssis, интерпретации данных, выполнения упражнения по генерации чисел, а затем вставки в базу данных сервера SQL.Я могу прочитать таблицу Excel и получить данные в порядке.Однако проблема, с которой я сталкиваюсь, заключается в создании номера и его вставке в базу данных.

Моя таблица Excel выглядит примерно так:

Range       Location    0   1   2   3   4   5   6   7   8   9                   
01132 21    Leeds       Y       Y   Y       Y   Y       Y

Так, например, мы читаем, чтодиапазон Лидса имеет «Y» под столбцом 2, это означает, что нам нужно генерировать числа между 01132212000 - 01132212999. Я немного уверен, как мы можем прочитать таблицу Excel, проверьте, есть ли у числа «Y»под ним сгенерируйте эти числа для этого диапазона, а затем вставьте все сгенерированные числа в базу данных.Есть идеи?

Ответы [ 2 ]

1 голос
/ 26 августа 2011

На самом деле не так уж сложно - если я могу предположить, что каждое из этих «чисел» должно отображаться в виде строки.

Вам необходим поток данных с источником Excel (который будет диктовать, чтовы запускаете ваш пакет в 32-битном режиме ).Затем вы использовали бы компонент Unpivot , чтобы превратить «числовые» столбцы в строки, чтобы в каждом диапазоне / местоположении была строка с Y или N. Используйте условное разбиение, чтобы отфильтровать N строк, иВы просто остались с Ys.Тогда вам понадобится источник - либо Источник скрипта , либо хитрый Источник OLE DB - для генерации 1000 строк, пронумерованных от 0 до 999. Вы будете выполнять декартовое объединение, используя Derived Columns, Sortsи Merge Join между строками Excel и номерами рядом.Затем вы можете использовать производный столбец, чтобы сгенерировать нужное вам «реальное» число, привести его в виде строки и дополнить его нулями.

Чтобы уточнить источник сценария или хитрый источник OLE DB"для генерации номеров строк ... Использование сценария в качестве источника:

  1. Добавьте один столбец, который является просто DT_I4.
  2. Внутри CreateNewOutputRows, используйте цикл for для повторения 1000 раз.внутри цикла используйте Output0Buffer.AddRow и установите для вашего столбца значение цикла.

Использование источника OLE DB:

  1. Создайте CTE или какой-либо другой T-Волшебство SQL (которое я не квалифицирован, чтобы предложить - я просто знаю, что это возможно), чтобы создать «таблицу чисел» от 1 до 1000 и выбрать из этого.
0 голосов
/ 26 августа 2011

Лично я бы решил это в базе данных.Создайте таблицу в своей БД для хранения необработанных данных из таблицы Excel.Затем вы можете решить эту проблему в SQL следующим образом:

create table #excel (
    range       nvarchar(7),
    location    nvarchar(20),
    col_0       nvarchar(1),
    col_1       nvarchar(1),
    col_2       nvarchar(1),
    col_3       nvarchar(1),
    col_4       nvarchar(1),
    col_5       nvarchar(1),
    col_6       nvarchar(1),
    col_7       nvarchar(1),
    col_8       nvarchar(1),
    col_9       nvarchar(1)
)

/*Use SSIS to load your Excel sheet in, instead of this insert*/
insert into #excel
values ('0113221', 'Leeds', 'Y', NULL, 'Y', 'Y', NULL, 'Y', 'Y', NULL, 'Y', NULL)


;with numbers as
(
    select 0 x
    union all
    select x + 1
    from numbers
    where x < 99
)
select e.location, e.range + '0' + RIGHT('00' + CAST(n.x as nvarchar), 3)
from #excel e cross join
    numbers n
where e.col_0 = 'Y'
union all
select e.location, e.range + '1' + RIGHT('00' + CAST(n.x as nvarchar), 3)
from #excel e cross join
    numbers n
where e.col_1 = 'Y'
union all
select e.location, e.range + '2' + RIGHT('00' + CAST(n.x as nvarchar), 3)
from #excel e cross join
    numbers n
where e.col_2 = 'Y'
union all
select e.location, e.range + '3' + RIGHT('00' + CAST(n.x as nvarchar), 3)
from #excel e cross join
    numbers n
where e.col_3 = 'Y'
union all
select e.location, e.range + '4' + RIGHT('00' + CAST(n.x as nvarchar), 3)
from #excel e cross join
    numbers n
where e.col_4 = 'Y'
union all
select e.location, e.range + '5' + RIGHT('00' + CAST(n.x as nvarchar), 3)
from #excel e cross join
    numbers n
where e.col_5 = 'Y'
union all
select e.location, e.range + '6' + RIGHT('00' + CAST(n.x as nvarchar), 3)
from #excel e cross join
    numbers n
where e.col_6 = 'Y'
union all
select e.location, e.range + '7' + RIGHT('00' + CAST(n.x as nvarchar), 3)
from #excel e cross join
    numbers n
where e.col_7 = 'Y'
union all
select e.location, e.range + '8' + RIGHT('00' + CAST(n.x as nvarchar), 3)
from #excel e cross join
    numbers n
where e.col_8 = 'Y'
union all
select e.location, e.range + '9' + RIGHT('00' + CAST(n.x as nvarchar), 3)
from #excel e cross join
    numbers n
where e.col_9 = 'Y'

Если вы можете нормализовать ваши данные при загрузке в следующий формат (или аналогичный), вы можете сэкономить много неопрятного кода:

create table #excel (
    range       nvarchar(7),
    location    nvarchar(20),
    number      nvarchar(1),
    yes_no      nvarchar(1)
)

insert into #excel
values ('0113221', 'Leeds', '0', 'Y'),
    ('0113221', 'Leeds', '1', NULL),
    ('0113221', 'Leeds', '2', 'Y'),
    ('0113221', 'Leeds', '3', 'Y'),
    ('0113221', 'Leeds', '4', NULL),
    ('0113221', 'Leeds', '5', 'Y'),
    ('0113221', 'Leeds', '6', 'Y'),
    ('0113221', 'Leeds', '7', NULL),
    ('0113221', 'Leeds', '8', 'Y'),
    ('0113221', 'Leeds', '9', NULL)


;with numbers as
(
    select 0 x
    union all
    select x + 1
    from numbers
    where x < 99
)
select e.location, e.range + e.number + RIGHT('00' + CAST(n.x as nvarchar), 3)
from #excel e cross join
    numbers n
where e.yes_no = 'Y'

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

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