ошибка под названием "Неверный синтаксис" рядом с фабрикой данных 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, вам нужно сделать что-то вроде этого:
зациклить свой результат и добавить
'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})