PyODBC + MS SQL Server + OPENROWSET для чтения/присоединения к таблице Excel с таблицей базы данных, не работающей через PyODBC

Я работаю над 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 подключается способом, недоступным для OPENROWSETMicrosoft.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''

person elrobis    schedule 25.06.2021    source источник
comment
Хорошо, это выглядит как собственная утилита Microsoft sqlcmd может сделать то, что я хочу здесь ... возможно, даже немного чище. Мне удалось заставить запрос выполняться через командную строку, поэтому следующим шагом будет найти способ использовать его в контексте, который я имею в виду.   -  person elrobis    schedule 26.06.2021
comment
Здесь многое происходит. Python и Excel хорошо работают вместе, Python и SQL Server хорошо работают вместе, а Excel и SQL Server хорошо работают вместе. Сделать тройку кажется несколько неортодоксальным. Какова ваша концовка здесь? Что вы действительно хотите сделать?   -  person ASH    schedule 18.07.2021
comment
Я хочу, чтобы автоматизация запускала хранимую процедуру или представление, которое может присоединиться к пользовательскому листу Excel в существующих таблицах базы данных, где сам запрос также устанавливает схему вывода (имена столбцов, типы данных, значения по умолчанию). Python — это просто клей для нескольких менее сложных аспектов, с которыми можно было бы справиться с помощью команд оболочки, но которые были бы чище в Python. Но еще одна проблема, с которой я столкнулся, заключается в том, что OPENROWSET(), похоже, не позволяет параметризовать имя файла как значение для хранимой процедуры. Хотя я могу обойти это. Конечно, меня интересуют предложения по лучшей стратегии.   -  person elrobis    schedule 19.07.2021