Я работаю над ETL, которому необходимо объединить электронную таблицу Excel пользователя с одной из таблиц нашей базы данных, чтобы получить широту и долготу и вернуть ее нашим пользователям. Для удобства сопровождения мне нужен конвейер, в котором запрос БД выполняет в основном всю работу с таблицами, а не код, потому что тогда я могу создать систему, в которой аналитики, не являющиеся программистами, могут соединять похожие решения, переписывая запрос.
Мой запрос для проверки концепции (ниже/внизу) работает в SQL Server Management Studio, но мне не удалось заставить его работать через соединение PyODBC. Обратите внимание: PyODBC подключается к тому же пользователю, который может выполнять этот запрос в SQL Management Studio. Я получаю сообщение об ошибке (выделено мной)..
[Microsoft][ODBC Driver 17 для SQL Server][SQL Server]Не удается инициализировать объект источника данных поставщика OLE DB Microsoft.ACE.OLEDB.12.0 для связанного сервера (пусто) сильный>. (7303) (SQLExecDirectW); [42000] [Microsoft] [Драйвер ODBC 17 для SQL Server] [SQL Server] Поставщик OLE DB Microsoft.ACE.OLEDB.12.0 для связанного сервера (нулевой) вернул сообщение Ошибка создания файла.. (7412)')
Я гуглил это всеми возможными способами. Существует Трюк с RegEdit, который не сработал или изменил ошибку. Еще одно перспективное направление требовало предоставления некоторым пользователям прав доступа к временным папкам пользователю "Все" и применения полного контроля. Я пробовал это на нескольких разных учетных записях пользователей, но безрезультатно и без изменений. Но, возможно, у меня не те учетные записи или временные папки.
Похоже, что PyODBC подключается способом, недоступным для OPENROWSET
› Microsoft.ACE.OLEDB.12.0
драйвера И/ИЛИ, контекст этого подключения не может получить доступ/прочитать расположение файла. На данный момент я убедился, что расположение файла доступно «Всем» с включенным полным доступом.
Еще одно замечание: я сократил это до SELECT * FROM FROM OPENROWSET(/*params*/)
, и он выдает ту же ошибку, поэтому я уверен, что проблема связана исключительно с этим подходом OpenRowSet
.
У меня нет сверхспецифического вопроса, кроме «Есть ли у кого-нибудь дополнительные идеи, почему это не работает?» В качестве альтернативы, если есть другой способ выполнить этот запрос в среде сценариев, отличной от Python/PyODBC, меня бы тоже заинтересовал этот вариант! Спасибо
select
/* THEIR TABLE DATA */
d."civic number",
d."street name",
d."road type",
/* OUR SPATIAL DATA TABLE */
a.FULLADDRESS,
a.STATUS,
a.SHAPE.STAsText() as wkt
/* THEIR EXCEL TABLE RESOURCE */
FROM OPENROWSET(
''Microsoft.ACE.OLEDB.12.0'',
''Excel 12.0;HDR=YES;Database=C:\Users\GeoTASKS\ETL\addresses.xlsx'',
''select * from [sheet1$]'') d
/* OUR DATABASE RESOURCE */
join gis.ADDRESS_POINTS a
on CONCAT(
UPPER(RTRIM(LTRIM(d."civic number"))), '' '',
UPPER(RTRIM(LTRIM(d."street name"))), '' '',
UPPER(sde.RCGeoAbbreviateRoadType(d."road type"))
) = upper(a.fulladdress)
where UPPER(RTRIM(LTRIM(a.STATUS))) = ''FINAL''
sqlcmd
может сделать то, что я хочу здесь ... возможно, даже немного чище. Мне удалось заставить запрос выполняться через командную строку, поэтому следующим шагом будет найти способ использовать его в контексте, который я имею в виду. - person elrobis   schedule 26.06.2021OPENROWSET()
, похоже, не позволяет параметризовать имя файла как значение для хранимой процедуры. Хотя я могу обойти это. Конечно, меня интересуют предложения по лучшей стратегии. - person elrobis   schedule 19.07.2021