从链接到Oracle的SQL Server编写SQL查询时,如何指定日期文字? [英] How do I specify date literal when writing SQL query from SQL Server that is linked to Oracle?

查看:85
本文介绍了从链接到Oracle的SQL Server编写SQL查询时,如何指定日期文字?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个链接到Oracle 12.1数据库的SQL Server 12.0数据库.

I have a SQL Server 12.0 database that is linked to an Oracle 12.1 database.

我想在SQL Server数据库中创建一个视图,该视图从按日期筛选的Oracle表中返回数据. Oracle表在日期列上有一个索引.

I want to create a view in the SQL Server database that returns data from an Oracle table filtered by date. The Oracle table has an index on the date column.

成功运行的查询是:

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

但是,这运行非常缓慢.我以为是因为比较是在SQL Server中进行的,所以返回的每一行.

However this runs very slowly. I assume it is because the comparison is taking place in SQL Server so every row is being returned.

如果我去:

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

然后它运行很快,大概是因为该条件已传递给Oracle,因此正在使用表上的Oracle索引.

Then it runs fast, presumably because the condition is being passed to Oracle so the Oracle index on the table is being used.

我的问题是我想创建一个视图.我找不到使用第二版代码创建视图的方法.如果我只是这样做:

My problem is that I want to create a view. I can't find a way of using the second version of the code to create a view. If I simply do:

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

然后它运行缓慢.

SQL Server将传递给Oracle的日期文字是否有另一种格式,还是有另一种解决方案?我也想知道这是否与创建指向Oracle的链接中使用的参数有关.作为参考,它们是:

Is there another format for the date literal that SQL Server will pass to Oracle, or is there another solution? I wondered also if it was to do with the parameters used in creating the link to Oracle. For reference they are:

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

我刚刚发现了一个非常类似的问题:

I just found a very similar question: Forcing a SQL Remote Query to filter remotely instead of locally

推荐答案

我更喜欢ODBC格式:

I prefer the ODBC format:

--DateTime
SELECT {ts'2015-09-20 12:30:00'}
--Time (however this comes with "today"-time)
SELECT {t'12:30:00'}
--Date
SELECT {d'2015-09-20'}
GO

简单的日期文字与文化无关...

The simple date literal is not culture independent...

SET LANGUAGE ENGLISH;
SELECT CAST('2014-09-13' AS DATETIME);
GO
SET LANGUAGE GERMAN;
SELECT CAST('2014-09-13' AS DATETIME);--ERROR: there's no month "13"
GO

但是它可以工作-但是-目标类型为DATE(这种区别很奇怪...):

But it works - however - with target type DATE (this difference is rather weird...):

SET LANGUAGE ENGLISH;
SELECT CAST('2014-09-13' AS DATE);
GO
SET LANGUAGE GERMAN;
SELECT CAST('2014-09-13' AS DATE);--ERROR: there's no month "13"
GO

对lad2025表示感谢,我想添加一些完整的ISO 8601,以便正常工作:

Thx to lad2025 I want to add for completness the "full" ISO 8601, which works fine:

SET LANGUAGE ENGLISH;
SELECT CAST('2014-09-13T12:30:00' AS DATETIME);
GO
SET LANGUAGE GERMAN;
SELECT CAST('2014-09-13T12:30:00' AS DATETIME);
GO

这篇关于从链接到Oracle的SQL Server编写SQL查询时,如何指定日期文字?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆