2017-02-06 10 views
0

Я импортирую стоимость покупки и покупки нескольких магазинов, где каждый магазин имеет свой собственный пакет (для использования параллелизма). Настройка этого процесса может быть довольно трудоемкой, так как я должен зайти в каждый магазин OLE DB Source и отрегулировать предложение FROM, чтобы зафиксировать, что в хранилище имеется отдельная база данных (база данных для номера магазина 9999 равна [database].[dbo].[sales9999]).Использовать переменные в разделе SSIS Select and From

Я также хочу использовать номер магазина в предложении Select для каждого магазина. Например, для клиента 9999 я должен иметь Select 9999 AS StoreKey в качестве столбца.

Поэтому я хотел бы иметь, как это:

SELECT ? as StoreKey, a.saleprice, b.purchasecost 
FROM ? AS a JOIN ? AS b ON a.ID = b.ID 

В моем OLE DB Source, и соответствуют ? «S с соответствующими параметрами. Однако, когда я пытался реализовать это, я получил ошибку, что параметры могут использоваться только в предложении Where, которое мне не нужно.

У кого-нибудь есть идеи?

С уважением,

+0

Плохая конструкция вашего стола, и вы не можете использовать параметры для имен столбцов или таблиц - только для значений. Можете ли вы изменить дизайн? –

+0

Что вы пытаетесь сделать и почему вы считаете, что «переменные» в заявлении являются ответом? SSIS не может работать без знания метаданных, с которыми он должен работать: столбцы, имена, размеры, линейность и т. Д. Каждый поток отличается, каждая таблица отличается. –

+1

* Если * вы хотите использовать один и тот же поток, с * идентичными * метаданными для загрузки данных из нескольких таблиц, вы можете использовать переменную для вычисления всего выражения. –

ответ

1

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

"SELECT N'"[email protected][User::strStoreKey]+"' as StoreKey, a.saleprice, b.purchasecost 
    FROM "[email protected][User::strTableName]+" AS a JOIN "[email protected][User::strAnotherTable]+" 
    AS b ON a.ID = b.ID" 

Здесь переменные должны быть определены с типом данных строка или типа отлитого в Expression.
Несколько важных моментов, на ум при использовании этого подхода:

  1. Результат множества всех Select запросов должны быть идентичны, с точки зрения столбцов, его названия и типы данных.
  2. Вы должны указать значения по умолчанию для запроса переменных здания, то есть strStoreKey, strTableName и strAnotherTable, что приводит к действительному запросу. В противном случае ваш пакет не сможет выполнить проверку при сохранении.
  3. Ваш поток данных должен иметь свойство, установленное следующим образом: DelayValidation=True. Это проверяет источник данных или назначение перед выполнением, а не на загрузку пакета.

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

+0

Спасибо за ответ! Думал, что это должно быть возможно. Что означает это N? От googling «SELECT N ..» кажется, что он возвращает N строк, или это означает что-то еще, что я нашел? – Cenderze

+0

@Cenderze, 'N '...'' означает, что строковые литералы внутри кавычек являются Unicode. Я предпочитаю использовать Unicode в пакете SSIS, чтобы избежать неявного преобразования кодовых страниц по умолчанию. – Ferdipux