Sql server 2005 在oracledb中使用T-SQL

Sql server 2005 在oracledb中使用T-SQL,sql-server-2005,Sql Server 2005,我在MicrosoftSQLServerStudio的查询窗口中直接使用T-SQL查询来访问大型Oracle数据库,我的SQL Server是2005 我已经创建了一个链接服务器作为myOracleServer。通过使用以下T-SQL查询: SELECT COUNT(*) FROM myOracleServer..owner.myTable WHERE id = 1000 AND Dt = '2009-02-26' 只打一个电话需要1分钟以上。对于小尺寸的表来说,这是可以的,但是Oracle端

我在MicrosoftSQLServerStudio的查询窗口中直接使用T-SQL查询来访问大型Oracle数据库,我的SQL Server是2005

我已经创建了一个链接服务器作为myOracleServer。通过使用以下T-SQL查询:

SELECT COUNT(*) FROM myOracleServer..owner.myTable WHERE id = 1000 AND Dt = '2009-02-26'
只打一个电话需要1分钟以上。对于小尺寸的表来说,这是可以的,但是Oracle端的myTable非常大,有数百万行数据

我发现,我可以使用OPENQUERY进行类似的调用,将SQL查询作为传递调用。结果很快。执行时间是00:00:02

SELECT * FROM OPENQUERY(myOracleServer, 'SELECT COUNT(*) FROM owner.myTable WHERE ...');
我遇到的问题是,查询不是一个常量字符串。我可能会在查询中更改id和Dt值,例如:

'SELECT COUNT(*) FROM ownwer.myTable WHERE id = ' + CAST(@id AS VARCHAR)...
SELECT COUNT(*) FROM myOracleServer..owner.myTable 
  WHERE id = 1000 AND Dt = '2009-02-26'
OPENQUERY不支持变量作为查询字符串或表达式


有没有其他方法可以快速将直通查询发送到Oracle?

试试这样的方法

DECLARE @sql varchar(2000)
SET @sql = SELECT COUNT(*) FROM owner.MyTable WHERE id = " + CAST(@id to varchar(9))
SELECT * FROM OPENQUERY(myOracleServer, @Sql)

您是否尝试过基于该查询创建视图?如果这样做有效,您应该能够像使用本地表一样使用该视图。

我想当我尝试将查询从SQL 2005 server传递到Oracle db时,我找到了一个解决缓慢问题的解决方案

有三种方法可以做到这一点。第一个类似于:

'SELECT COUNT(*) FROM ownwer.myTable WHERE id = ' + CAST(@id AS VARCHAR)...
SELECT COUNT(*) FROM myOracleServer..owner.myTable 
  WHERE id = 1000 AND Dt = '2009-02-26'
如果Oracle端的表很大,例如有300万行数据,那么执行时间非常长。今天我在我的SQL server上再次尝试了它,仅一个查询就花费了大约2英尺44的时间,可能在工作日表格非常繁忙

第二种方法是使用OPENQUERY,如我在问题中所述:

SELECT COUNT(*) FROM OPENQUERY(myOracleServer, N'SELECT COUNT(*) FROM 
  owner.myTable WHERE id = 1000 AND Dt = TO_DATE(''2009-02-26'')'); 
它非常快。我再次运行它,执行时间是00:00:00,速度惊人!然而,这个方法的问题是OPENQUERY不支持变量作为查询

事实上,我发现了这个方法,昨天工作到很晚的时候,我对这个结果非常兴奋。我昨晚写了一篇博客。今天早上,当我试图将其应用到存储过程中时,我无法使用OPENQUERY,因为在我的例子中,变量查询必须基于id和日期构建

好消息是,我找到了第三条路,这是一个很好的解决方案:

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'SELECT COUNT(*) FROM owner.myTable WHERE id = ' + 
  CAST(@id AS VARCHAR) + N' AND Dt = TO_DATE(''' + @dt +
  N''', ''yyyy-mm--dd'')');
EXEC (@sql) AT myOracleServer;
这里的关键点是使用EXEC和AT来指定远程服务器或链接服务器,并且不要忘记使用括号@sql变量。执行时间是00:00:00


我的bog将在今晚更新。

正如我提到的,OPENQUERY确实支持变量。请参阅OPENQUERY的msdn。是的,我刚看过。除此之外,您可以使用该语句创建一个临时存储过程,但这有点过分,除非性能差异绝对惊人。我想知道CLR proc是否是一个选项。如果它作为本地表,我想这就是导致low的原因。我喜欢传递查询,但如果它不是OPENQUERY的常量,则不工作。