Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server 2012 fragt Access 2007-Daten mit OPENROWSET-Fehler ab

Endlich, nach mehreren erfolglosen Versuchen, SQL Server mit einer Access-Datenbank „sprechen“ zu lassen – entweder als „Linked Server“ in SSMS oder über OPENROWSET() in T-SQL – Ich habe diesen Blogbeitrag gefunden, der die folgenden drei (3) Vorschläge enthält.

Optimierung Nr. 1:OLE DB-Provider-Einstellungen

Beim OLE DB-Anbieter für ACE (oder Jet) müssen die Optionen „Dynamischer Parameter“ und „In Bearbeitung zulassen“ aktiviert sein. Öffnen Sie in SSMS die

Serverobjekte> Verbindungsserver>Anbieter

Zweig, klicken Sie mit der rechten Maustaste auf „Microsoft.ACE.OLEDB.12.0“ (oder „Microsoft.Jet.OLEDB.4.0“), wählen Sie „Eigenschaften“ und stellen Sie sicher, dass diese Optionen ausgewählt sind:

Anpassung Nr. 2:Berechtigungen für Temp-Ordner

Das ist derjenige, der mich verblüfft hat.

Anscheinend muss SQL Server Informationen in eine temporäre Datei schreiben, während eine OLE DB-Abfrage für eine Access-Datenbank ausgeführt wird. Da SQL Server als Dienst ausgeführt wird, verwendet es den %TEMP%-Ordner des Kontos, unter dem der Dienst ausgeführt wird.

Wenn der SQL Server-Dienst unter dem integrierten „Netzwerkdienst“-Konto ausgeführt wird, lautet der temporäre Ordner

%SystemRoot%\ServiceProfiles\NetworkService\AppData\Local\Temp

und wenn es unter dem integrierten "Lokaler Dienst"-Konto läuft, dann ist der Temp-Ordner

%SystemRoot%\ServiceProfiles\LocalService\AppData\Local\Temp

Mein Problem war, dass SSMS unter my lief Konto (nicht NETZWERKDIENST), sodass ich nur Lesezugriff auf den Temp-Ordner hatte

Sobald ich mir selbst die Berechtigung zum Ändern für diesen Ordner erteilt habe

und aktivierte OPENROWSET-Abfragen, wie in einer anderen Frage hier dokumentiert, nämlich ...

EXEC sp_configure 'show advanced options', 1
RECONFIGURE
GO
EXEC sp_configure 'ad hoc distributed queries', 1
RECONFIGURE
GO

... meine Abfrage hat gut funktioniert:

Tweak #3:memory_to_reserve

Obwohl ich es in meinem Fall nicht verwenden musste, behauptet der oben genannte Blog auch, dass das Anpassen des Startparameters „-g memory_to_reserve“ für den SQL Server-Dienst auch dazu beitragen kann, ähnliche Fehler zu vermeiden. Dazu:

  • SQL Server Configuration Manager starten
  • Klicken Sie mit der rechten Maustaste auf den SQL Server-Dienst (Registerkarte "SQL Server-Dienste") und wählen Sie "Eigenschaften"
  • Stellen Sie auf der Registerkarte "Erweitert" -g512; voran zur Einstellung "Startparameter"
  • Starten Sie den SQL Server-Dienst neu

Weitere Einzelheiten zur Einstellung "memory_to_reserve" finden Sie hier im MSDN-Artikel.