急求!SQLServer2008中的数据集作为条件通过Openquery查询Oracle数据

summer_chen_2008 2015-11-19 02:59:09
      SELECT *
FROM OPENQUERY([ETEAMQC2], '
select * from SALES.V_PROD_DESC2 ') AS derivedtbl_1
WHERE (PART_NO in
(SELECT EBSITEM_NUMBER collate SQL_Latin1_General_CP1_CI_AS
FROM ProductCorrespond
WHERE (ProductID = 2736)))

这样查询很慢,流程操作好像是先将所有的Oracle数据传到sqlserver里,然后再过滤一样,效率很低,Sql条件数据大概有2-3千笔。

单独的条件查询很快
4.	SELECT * FROM OPENQUERY([ETEAMQC2] , 'select * from SALES.V_PROD_DESC2  WHERE  Part_no = (''90NB0921-M00080'')')


寻求高手解决办法。
...全文
286 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
summer_chen_2008 2015-11-19
  • 打赏
  • 举报
回复
确实可行,完整代码如下
declare @sql varchar(max)='';
if exists(SELECT 1 FROM   ProductCorrespond WHERE (ProductID = 2736))
    SELECT @sql=@sql+','''+EBSITEM_NUMBER collate SQL_Latin1_General_CP1_CI_AS +''''
                    FROM   ProductCorrespond
                    WHERE (ProductID = 2736)    
    set @sql=STUFF(@sql,1,1,'')
    set @sql='select * from SALES.V_PROD_DESC2 where PART_NO in ('+@sql+')' 
    set @sql='SELECT * FROM OPENQUERY([ETEAMQC2] , '''+replace(@sql,'''','''''')+''')'
    select @sql
  -- exec (@sql)
实际执行代码如下,提示错误信息: is too long. Maximum length is 8000.
SELECT * FROM OPENQUERY([ETEAMQC2] , 'select * from SALES.V_PROD_DESC2 where PART_NO in (''VP-9NWTA320Y'',''VP-9NWTA321Y'',''VP-9NWTA322Y'',''VP-9NWTA323Y'',''VP-9NWTA324Y'',''VP-9NWTA325Y'',''VP-9NWTA326Y'',''VP-9NWTA327Y'',''VP-9NWTA328Y'',''VP-9NWTA329Y''.........)')
summer_chen_2008 2015-11-19
  • 打赏
  • 举报
回复
引用 3 楼 spiritofdragon 的回复:
ProductCorrespond是sql server的表吧? SALES.V_PROD_DESC2是 oracle的表吧? 运行环境是sql server吧? 那么,你的语句的意思就是把SALES.V_PROD_DESC2的数据全查出来,再在sql server中关联。 为什么不把关联限制直接传到oracle中过滤,即加快了访问速度,又减低了传输数据量。最后,直接把关联结果显示到sqlserver中不就行了。

declare @sql varchar(max)='';
if exists(SELECT 1 FROM   ProductCorrespond WHERE (ProductID = 2736))
begin
	SELECT @sql=@sql+','''+EBSITEM_NUMBER collate SQL_Latin1_General_CP1_CI_AS +''''
                    FROM   ProductCorrespond
                    WHERE (ProductID = 2736);
	set @sql=STUFF(@sql,1,1,'');
	set @sql='select * from SALES.V_PROD_DESC2 where PART_NO in ('+@sql+')' ;
	SELECT *
	FROM  OPENQUERY([ETEAMQC2], @sql ) AS derivedtbl_1
end               
大概意思就是这样,可能还有更高效的连接方式,需要调试。但你自己明白目的是把关联条件或者说是where条件传到oracle那么,所有工作干完了,再直接把结果传回来就行了。这样,只要优化oracle的语句就行了。
数据量大,超过了8000字符·,咋办呀,有办法吗?
spiritofdragon 2015-11-19
  • 打赏
  • 举报
回复
ProductCorrespond是sql server的表吧? SALES.V_PROD_DESC2是 oracle的表吧? 运行环境是sql server吧? 那么,你的语句的意思就是把SALES.V_PROD_DESC2的数据全查出来,再在sql server中关联。 为什么不把关联限制直接传到oracle中过滤,即加快了访问速度,又减低了传输数据量。最后,直接把关联结果显示到sqlserver中不就行了。

declare @sql varchar(max)='';
if exists(SELECT 1 FROM   ProductCorrespond WHERE (ProductID = 2736))
begin
	SELECT @sql=@sql+','''+EBSITEM_NUMBER collate SQL_Latin1_General_CP1_CI_AS +''''
                    FROM   ProductCorrespond
                    WHERE (ProductID = 2736);
	set @sql=STUFF(@sql,1,1,'');
	set @sql='select * from SALES.V_PROD_DESC2 where PART_NO in ('+@sql+')' ;
	SELECT *
	FROM  OPENQUERY([ETEAMQC2], @sql ) AS derivedtbl_1
end               
大概意思就是这样,可能还有更高效的连接方式,需要调试。但你自己明白目的是把关联条件或者说是where条件传到oracle那么,所有工作干完了,再直接把结果传回来就行了。这样,只要优化oracle的语句就行了。
summer_chen_2008 2015-11-19
  • 打赏
  • 举报
回复
引用 1 楼 u010192842 的回复:
可否用临时表呢?先把数据取出来放临时表中,然后再in它。
考虑过,Oracle里面有上千万条的数据,效率不是很高
Yole 2015-11-19
  • 打赏
  • 举报
回复
可否用临时表呢?先把数据取出来放临时表中,然后再in它。

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧