ошибка под названием "Неверный синтаксис" рядом с фабрикой данных Azure

Я пытаюсь выполнить простое инкрементное обновление из исходной локальной базы данных в базу данных SQL Azure на основе столбца Varchar под названием «RP» в локальной базе данных, который содержит «дату + статическое описание», например: «20210314MetroFactory»

Снимок столбцов локальной БД

1. Я создал действие поиска под названием Lookup1, используя таблицу, созданную в базе данных SQL Azure, и использует этот запрос.

«Выбрать RP из SubsetwatermarkTable»

Снимок активности поиска

2- Я создал действие копирования данных, где в исходных настройках есть этот запрос.

"Выберите * из SourceDevSubsetTable, ГДЕ RP НЕ В '@{activity('Lookup1'). Output.value}'"

Копировать снимок активности

При отладке - получаю ошибку:

Тип ошибки: проблема конфигурации пользователя.

Подробности: сбой произошел на стороне источника. 'Type = System.Data.SqlClient.SqlException,Message = Неверный синтаксис рядом с'[{"RP":"20210307_1Plant 1KAO"},{"RP":"20210314MetroFactory"},{"RP":"20210312MetroFactory"},{"RP":"20210312MetroFactory"},{"RP": "2 '.,Source = .Net Поставщик данных SqlClient, SqlErrorNumber = 102, Class = 15,ErrorCode = -2146232060,State = 1, Errors = [{Class = 15, число = 102, состояние = 1, сообщение = неправильный синтаксис рядом с '[{"RP":"20210311MetroFactory"},{"RP":"20210311MetroFactory"},{"RP":"202103140MetroFactory"},{"RP":"20210308MetroFactory"},{"RP":" 2 '.,},],'

Может ли кто-нибудь сказать мне, что я делаю не так и как это исправить, даже если это требует создания дополнительных действий. Примечание: в таблице нет столбца LastModifiedDate, также я еще не создал StoredProcedure, который обновит таблицу поиска, когда это будет выполнено с помощью инкрементной копии.

2 ответа

Результатом является массив, подобный вашей ошибке.

[{"RP":"20210307_1Завод 1KAO"},{"RP":"20210314MetroFactory"},{"RP":"20210312MetroFactory"},{"RP":"20210312MetroFactory"},{"RP": "2 '.,Source = .NetSqlClient DataProvider,SqlErrorNumber = 102,Class = 15,ErrorCode = -2146232060,State = 1,Errors = [{Class = 15,Number = 102,State = 1,Message = Incorrectsyntax near'[{"RP":"20210311MetroFactory"},{"RP":"20210311MetroFactory"},{"RP":"202103140MetroFactory"},{"RP":"20210308MetroFactory"},{"RP": "2 '.,},]

Однако ваш SQL должен быть таким: Select * from SourceDevSubsetTable WHERE RP NOT IN ('20210307_1Plant 1KAO','20210314MetroFactory',...).

Чтобы добиться этого в ADF, вам нужно сделать что-то вроде этого:

  1. создайте три переменные, как на следующем снимке экрана:

  2. зациклить свой результат и добавить 'item().RP' в значения массива:

выражение: @activity('Lookup1').output.value

выражение: @concat(variables('apostrophe'),item().RP,variables('apostrophe'))

3. преобразовать значения массива в строку и добавить круглые скобки с помощью выражения Set variable activity: @concat('(',join(variables('arrayvalues'),','),')')

4. скопируйте в выражение базы данных Azure SQL: Select * from SourceDevSubsetTable WHERE RP NOT IN @{variables('stringvalues')}

Стив прав в отношении того, почему это не удается, и в вопросе, который вам нужен в копировании данных.

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

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

      select stuff(
  (
    select ','''+rp+''''
    from   subsetwatermarktable
    for    xml path('')
  )
  , 1, 1, ''
) as in_clause

Подзапрос получает список, разделенный запятыми, с кавычками вокруг каждого rp-значения, но имеет ложную запятую в начале - внешний запрос с stuff удаляет это.

Теперь отметьте поле First Row Only в Lookup и измените запрос Copy Data source на:

      select *
from   SourceDevSubsetTable
where  rp not in (@{activity('lookup').output.firstRow.in_clause})
Другие вопросы по тегам