Wie gebe ich ein Datumsliteral an, wenn ich eine SQL-Abfrage von einem mit Oracle verknüpften SQL Server schreibe?

Ich habe eine SQL Server 12.0-Datenbank, die mit einer Oracle 12.1-Datenbank verknüpft ist.

Ich möchte eine Ansicht in der SQL Server-Datenbank erstellen, die nach Datum gefilterte Daten aus einer Oracle-Tabelle zurückgibt. Die Oracle-Tabelle enthält einen Index für die Datumsspalte.

Eine Abfrage, die erfolgreich funktioniert, lautet:

select * from ORADB..SCHEMA.MYTABLE where MYDATE >= '20140701';

Das läuft aber sehr langsam. Ich gehe davon aus, dass der Vergleich in SQL Server stattfindet, sodass jede Zeile zurückgegeben wird.

Wenn ich gehe

DECLARE @earliest date = '20140701';
select * from ORADB..SCHEMA.MYTABLE where MYDATE >= @earliest;

Dann läuft es schnell, vermutlich, weil die Bedingung an Oracle übergeben wird und der Oracle-Index für die Tabelle verwendet wird.

Mein Problem ist, dass ich eine Ansicht erstellen möchte. Ich kann keine Möglichkeit finden, mit der zweiten Version des Codes eine Ansicht zu erstellen. Wenn ich einfach mache:

create myview as select * from ORADB..SCHEMA.MYTABLE where MYDATE >= '20140701';

Dann läuft es langsam.

Gibt es ein anderes Format für das Datumsliteral, das SQL Server an Oracle übergibt, oder gibt es eine andere Lösung? Ich habe mich auch gefragt, ob dies mit den Parametern zu tun hat, mit denen die Verbindung zu Oracle hergestellt wurde. Als Referenz sind sie:

USE [master]
GO
EXEC master.dbo.sp_addlinkedserver @server = N'ORADB', @srvproduct=N'Oracle', @provider=N'OraOLEDB.Oracle', @datasrc=N'DPDB'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'ORADB',@useself=N'False',@locallogin=NULL,@rmtuser=N'MYUSER',@rmtpassword='#######'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'collation compatible', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'data access', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'dist', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'pub', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'rpc', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'rpc out', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'sub', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'connect timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'collation name', @optvalue=null
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'lazy schema validation', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'query timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'use remote collation', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'remote proc transaction promotion', @optvalue=N'true'
GO

EDIT: Ich habe gerade eine sehr ähnliche Frage gefunden:Erzwingen, dass eine SQL Remote-Abfrage remote statt lokal gefiltert wird

Antworten auf die Frage(6)

Ihre Antwort auf die Frage