Wie kann ich festlegen Datum-literal beim schreiben von SQL-Abfrage aus SQL-Server, ist mit Oracle?

Ich habe einen SQL Server 12.0-Datenbank, die mit Oracle 12.1 Datenbank.

Möchte ich eine Ansicht erstellen, in der SQL Server-Datenbank gibt Daten aus einer Oracle-Tabelle mit Filterung nach Datum. Die Oracle-Tabelle ein index auf die Spalte Datum.

Einer Abfrage, die funktioniert, erfolgreich ist:

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

Aber dieser läuft sehr langsam. Ich nehme an, es ist, weil der Vergleich in SQL Server so, dass 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 weitergegeben werden Oracle, so der Oracle-index der Tabelle verwendet wird.

Mein problem ist, dass ich eine Sicht anlegen möchten. Ich kann nicht einen Weg finden, der unter Verwendung der zweiten version der code zum erstellen einer Ansicht. Wenn ich einfach tun:

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

Dann läuft es langsam.

Ist es ein anderes format für die Datums-literal von SQL Server auf Oracle, oder gibt es eine andere Lösung? Ich fragte mich auch, wenn es zu tun war, mit den Parametern, die beim erstellen der Verbindung zu Oracle. Für die Referenz-Sie sind:

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: Erzwingen einer SQL Remote-Abfrage-filtern aus der Ferne statt lokal

Versuchen Sie das ISO-format '2014-01-01' YYYY-MM-DD
Danke @lad2025, das habe ich versucht aber es läuft immer noch langsam.
Da kann man nicht erstellen Sie eine Ansicht mit einem parameter, warum nicht einfach eine Funktion erstellen, statt ? Sie können es verwenden, wie eine Aussicht, sich ihm anzuschließen, UND haben params.
Danke @iDevlop, ich war versucht, Dinge einfach zu halten. Das ist wahrscheinlich auch mein Nächster Ansatz. Die andere Bewegung ist die Filterung der Blick zurück in Oracle, aber ich habe versucht, dies zu vermeiden.
Das problem, das Sie haben, ist nicht gebunden an das format des Datums-Literale... Sie haben eine Lösung zu finden, indem Sie Ihre Datum als parameter.

InformationsquelleAutor Richard A | 2015-10-20

Schreibe einen Kommentar