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
'2014-01-01'
YYYY-MM-DDDanke @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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bevorzuge ich die ODBC-format:
Die einfache Datums-literal ist nicht Kultur-unabhängig...
Aber es funktioniert - jedoch - mit-Ziel-Typ
DATE
(dieser Unterschied ist ziemlich seltsam...):Thx an lad2025 ich hinzufügen möchten für die Vollständigkeit der "voll" ISO 8601, die gut funktioniert:
Vielleicht war ich nicht spezifisch genug, über ISO-format von ISO-8601-Format
The advantage in using the ISO 8601 format is that it is an international standard. datetime values that are specified by using this format are unambiguous
UndAlso, this format is not affected by the SET DATEFORMAT or SET LANGUAGE settings.
, Aber Sie müssen verwenden Sie voll-Spezifikation mit der Zeit Teil.Sie sind Rechte mit der impliziten Konvertierung, sondern einfach nur versuchen, den zweiten code-block. Die Besetzung wirft eine Ausnahme, weil die "13" ist als Monat... Ändern Sie den "13" auf eine kleinere Anzahl und die Form wird wieder kommen, mit zwei verschiedenen Terminen...
Ich war nicht spezifisch genug. Überprüfen Sie mit voller datetime demo.
'2014-09-13T00:00:00'
ist Kultur unabhängig. Es gibt keine Fehler.Hinzugefügt Eure Hinweise auf meine Antwort...
InformationsquelleAutor Shnugo
Ich schlage vor, verwenden Sie die ANSI Datum-literal verwendet ein festgelegtes Format YYYY-MM-DD.
Beispielsweise
In Oracle
'20140701'
ist ein string und nicht ein DATUM. Sie könnten nur glücklich sein, um zu sehen, eine implizite Datentyp-Konvertierung und erhalten das Ergebnis auf der Grundlage der Gebietsschema-spezifische NLS-Einstellungen von deinem client. Sie sollten immer vermeiden, und explizit konvertieren Sie die Zeichenfolge in das Datum für das Datum Vergleiche.Allerdings (das ist ziemlich seltsam...), ist Es möglich zu wirken und wandeln diese in
DATE
, Aber wenn Sie die cast-oder convert-it zuDATETIME
es ist nicht die Kultur independant... VersuchenSET LANGUAGE GERMAN; SELECT CAST('2015-10-20' AS DATE);
und dann ändern Sie dies inDATETIME
InformationsquelleAutor Lalit Kumar B
Ich würde empfehlen, mit der vollen ISO-8601-format wie vorgeschlagen von @lad2025:
Dies ist überlegen die ODBC-format vorgeschlagen von @Shnugo.
In SQL Server 2014 mindestens der ODBC-format funktioniert nicht für Daten, die vor 1753-01-01 (z.B. Termine außerhalb der Reichweite der alten DATETIME-Datentyp), während der ISO-8601-format hat.
Um dies zu testen selber, probieren Sie die folgenden Abfragen:
Selbst wenn Sie glaube nicht, dass die Daten mit dem Sie arbeiten, wird immer sein, die vor dem Jahr 1753, es ist eine gute Angewohnheit zu sein. Ich lief in dieses, während Sie auf die Einrichtung eines Kalender-Tabelle als Referenz in Abfragen.
InformationsquelleAutor Tidorith