Wreszcie, po kilku nieudanych próbach, aby SQL Server „porozmawiał” z bazą danych programu Access — jako „serwer połączony” w SSMS lub za pomocą OPENROWSET()
w T-SQL – znalazłem ten wpis na blogu, który zawierał następujące trzy (3) sugestie.
Poprawka nr 1:Ustawienia dostawcy OLE DB
Dostawca OLE DB dla ACE (lub Jet) musi mieć włączone opcje „Parametr dynamiczny” i „Zezwalaj na przetwarzanie”. W programie SSMS otwórz
Obiekty serwerowe> Serwery połączone>Dostawcy
kliknij prawym przyciskiem myszy "Microsoft.ACE.OLEDB.12.0" (lub "Microsoft.Jet.OLEDB.4.0"), wybierz "Właściwości" i upewnij się, że te opcje są zaznaczone:
Poprawka nr 2:uprawnienia do folderu tymczasowego
To jest ten, który mnie zbijał z tropu.
Najwyraźniej SQL Server musi zapisywać informacje w pliku tymczasowym podczas wykonywania zapytania OLE DB w bazie danych programu Access. Ponieważ SQL Server działa jako usługa, używa folderu %TEMP% konta, na którym działa usługa.
Jeśli usługa SQL Server działa na wbudowanym koncie „Usługa sieciowa”, folder tymczasowy to
%SystemRoot%\ServiceProfiles\NetworkService\AppData\Local\Temp
a jeśli działa na wbudowanym koncie „Usługa lokalna”, to folder tymczasowy to
%SystemRoot%\ServiceProfiles\LocalService\AppData\Local\Temp
Mój problem polegał na tym, że SSMS działał pod moim konto (nie NETWORK SERVICE), więc miałem dostęp tylko do odczytu do folderu Temp
Po przyznaniu sobie uprawnień do modyfikacji w tym folderze
i włączono zapytania OPENROWSET zgodnie z dokumentacją w innym pytaniu tutaj, a mianowicie ...
EXEC sp_configure 'show advanced options', 1
RECONFIGURE
GO
EXEC sp_configure 'ad hoc distributed queries', 1
RECONFIGURE
GO
... moje zapytanie zadziałało poprawnie:
Poprawka nr 3:memory_to_reserve
Chociaż nie musiałem go używać w moim przypadku, wspomniany blog twierdzi również, że dostosowanie parametru startowego "-g memory_to_reserve" dla usługi SQL Server może również pomóc w uniknięciu podobnych błędów. Aby to zrobić:
- uruchom Menedżera konfiguracji serwera SQL
- kliknij prawym przyciskiem myszy usługę SQL Server (zakładka „SQL Server Services”) i wybierz „Właściwości”
- na karcie „Zaawansowane” dodaj przedrostek
-g512;
do ustawienia „Parametry uruchamiania” - zrestartuj usługę SQL Server
Więcej informacji na temat ustawienia „memory_to_reserve” można znaleźć w artykule MSDN tutaj.