Как создать sourceOLEDB в потоке данных с предложением where является подзапросом из другой базы данных - PullRequest
1 голос
/ 24 апреля 2019

У меня в базе данных несколько идентификаторов заказа. И я хочу выбрать в другой базе данных взять строку этих заказов.

Для достижения моей цели я создаю задачу SQL для получения идентификатора всех ордеров в переменной (объекте) и для каждого цикла я включаю поток данных для извлечения каждого идентификатора для запроса моего источника ole db. Но это долго, и я делаю много связей.

Я хочу обойти этот цикл и сделать один запрос с предложением where, используя IN вместо =?

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

SELECT .... WHERE Colon IN ?

Спасибо за вашу помощь

Ответы [ 3 ]

2 голосов
/ 24 апреля 2019

Вам потребуется создать два исходных запроса OLEDB, а затем MERGE JOIN (использовать INNER JOIN) в столбце, который вы хотите использовать для предложения IN.

1 голос
/ 24 апреля 2019

Вы можете использовать выражение для достижения этого .

В этом ответе я буду предполагать, что вы объединили все идентификаторы в одну строковую переменную, например 1,2,3,4,5.

Теперь необходимо создать переменную типа string @[User::SQLQuery], задать для свойства переменной EvaluateAsExpression значение true и определить использование следующего выражения:

"SELECT * FROM SourceTable WHERE ID IN (" + @[User::InClauseVariable] + ")"

(где @[User::InClauseVariable] - переменная, содержащая значения)

А в источнике OLEDB измените режим доступа на SQL Command from Variable и используйте переменную @[User::SQLQuery].

1 голос
/ 24 апреля 2019

Обе базы данных размещены на одном и том же экземпляре SQL Server? Если это так, можно выполнить фильтрацию в начальном запросе, используя имена трех частей, например Database.Schema.Table. В приведенном ниже примере TABLE2 используется для проверки совпадения идентификаторов. Измените режим доступа к данным на команду SQL в источнике OLE DB, и затем вы сможете ссылаться на таблицы в других базах данных (на том же сервере), используя это соглашение об именах. INNER JOIN используется для возврата только совпадающих строк из TABLE1. В вопросе не указывалось, был ли столбец идентификатора уникальным, так что для безопасности я предположил, что это не так, и DISTINCT используется в подзапросе, чтобы гарантировать, что возвращаются только уникальные значения. Если таблицы находятся в базах данных на разных серверах, то можно использовать преобразование «Уточняющий запрос» для возврата только тех строк из исходной таблицы с совпадающим идентификатором в таблице, где выполняется поиск. Это дополнительно изложено ниже.

  • В редакторе «Преобразование подстановок» выберите параметр Redirect Rows to No Match Output на странице General.
  • На вкладке Connection выберите диспетчер соединений OLE DB для базы данных, содержащей таблицу, которая будет использоваться для поиска (фильтрация по идентификатору). Я бы рекомендовал использовать опцию SQL-запроса вместо таблицы / представления, чтобы получить только необходимый столбец. Для запроса SQL напишите запрос, выбрав в таблице столбец идентификаторов, который будет использоваться для сопоставления идентификаторов.
  • На панели Columns перетащите линию из столбца ID в поле Available Input Columns в столбец ID в поле Available Lookup Columns.
  • При подключении вывода преобразования «Уточняющий запрос» к месту назначения выберите Lookup Match Output, чтобы получить соответствующие строки. Lookup No Match Output можно игнорировать, и эти строки будут отброшены.

Пример трехстороннего соглашения о присвоении имен:

SELECT
    T1.ID
FROM DATABASE1.SCHEMA.TABLE1 T1
INNER JOIN (SELECT DISTINCT ID FROM DATABASE2.SCHEMA.TABLE2) T2 ON T1.ID = T2.ID
...