sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server 2012 frågar Access 2007-data med OPENROWSET-fel

Slutligen, efter flera misslyckade försök att få SQL Server att "prata med" en Access-databas – antingen som en "länkad server" i SSMS eller via OPENROWSET() i T-SQL – Jag hittade det här blogginlägget som gav följande tre (3) förslag.

Tweak #1:OLE DB-leverantörsinställningar

OLE DB-leverantören för ACE (eller Jet) måste ha alternativen "Dynamic parameter" och "Allow inprocess" aktiverade. I SSMS öppnar du

Serverobjekt> Länkade servrar>Leverantörer

högerklicka på "Microsoft.ACE.OLEDB.12.0" (eller "Microsoft.Jet.OLEDB.4.0"), välj "Egenskaper" och se till att dessa alternativ är valda:

Tweak #2:Temp-mappbehörigheter

Det här var den som överraskade mig.

Uppenbarligen behöver SQL Server skriva information i en temporär fil när en OLE DB-fråga körs mot en Access-databas. Eftersom SQL Server körs som en tjänst använder den mappen %TEMP% för kontot som tjänsten körs under.

Om SQL Server-tjänsten körs under det inbyggda "Network Service"-kontot är temp-mappen

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

och om den körs under det inbyggda "Local Service"-kontot är temp-mappen

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

Mitt problem var att SSMS kördes under min konto (inte NÄTVERKSTJÄNST) så jag hade bara läsbehörighet till Temp-mappen

När jag gav mig själv Ändra behörigheter för den mappen

och aktiverade OPENROWSET-frågor som dokumenterats i en annan fråga här, nämligen ...

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

... min fråga fungerade bra:

Tweak #3:memory_to_reserve

Även om jag inte behövde använda den i mitt fall, hävdar den tidigare nämnda bloggen också att justering av startparametern "-g memory_to_reserve" för SQL Server-tjänsten också kan hjälpa till att undvika liknande fel. För att göra det:

  • starta SQL Server Configuration Manager
  • högerklicka på SQL Server-tjänsten ("SQL Server Services"-fliken) och välj "Egenskaper"
  • på fliken "Avancerat" lägger du till -g512; till inställningen "Startparametrar"
  • starta om SQL Server-tjänsten

För mer information om inställningen "memory_to_reserve" se MSDN-artikeln här.



  1. Optimera TempDB:Undvika flaskhalsar och prestandaproblem

  2. Hur man listar alla databaser med PostgreSQL

  3. Hur ändrar man identitetskolumns värden programmatiskt?

  4. hur man ställer in automatisk inkrementkolumn med sql-utvecklare