sql server与oracle链接问题

通过执行
select * from openquery(XXXX,'select * from YYYYY.abc')
where year_month='201405'
时出现
“ora-01652:无法通过256(在表空间temp中)扩展temp段”

请问大神们如何解决?

走了好多弯路,不过终于成功了,现将正确的步骤整理如下,供大家参考:
SQL Server Management Studio Express(简写SSMS)
SQL Server配置管理器:SQL Server Configuration Manager(简写SSCM)
一、 开启SQL Server 2008远程连接---如果已经开启,则可以跳过
1. 打开SSMS,用Windows身份连接数据库后,右键点击数据库引擎,选择“属性”
2. 左侧选择“安全性”,选中右侧的“SQL Server和Windows身份验证模式”以启用混合登录模式
3. 左侧选择“连接”,勾选“允许远程连接此服务器”,然后点“确定”
4. 打开SSCM,选中左侧的“SQL Server服务”,确保右侧的“SQL Server”以及“SQL Server Browser”正在运行
5. 选中左侧“SQL Server网络配置”下的“MSSQLSERVER的协议”,右侧的TCP/IP默认是“Disabled”,双击或右键点击选“属性”,在“协议”选项卡中将其修改为“Enabled”,在“IP Address”选项卡,设置端口“1433”
6. 选中左侧“SQL Native Client 10.0配置”下的“客户端协议”,将“TCP/IP”也修改为“Enabled”
7. 重新启动SQL Server 2008
8. 此时应该可以使用了,但还是要确认一下防火墙。将SQLServr.exe(C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\Binn\sqlservr.exe)添加到允许的列表中
二、 安装Oracle客户端软件
可以去Oracle官网下载,比如“10201_client_win32”
安装成功后,在Oracle客户端安装目录下的/network/admin/tnsnames.ora配置所要连接的服务器的相关信息,比如:
TEST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.11.90)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
如果admin目录下没有“tnsnames.ora”,新建一个文本文件,改名为“tnsnames.ora”
三、 添加Windows的ODBC数据源
1. 开始->管理工具->数据源(ODBC),有些“开始”菜单中没有放“管理工具”连接,则可以先到“控制面板”中,然后选择“性能和维护”,就可以找到“管理工具”了
2. 在“用户DSN”选项卡或者“系统DSN”选项卡下,点击“添加”,选择“Microsoft ODBC for Oracle”后点击“完成”
3. 填写相关信息
数据源名称、服务器名称与“tnsnames.ora”中配置的一样,其他两项可以忽略
填好后,点击“确定”
四、 在SSMS中创建链接服务器
1. 在SSMS中,展开已经连接上的某数据库引擎,依次选择服务器对象->链接服务器,在“链接服务器”上点右键,选择“新建链接服务器”

2. 在“常规”选项卡上按照如下填写:
“链接服务器”,随便取个名字
“访问接口”和“产品名称”如上图所示,不要做任何改变,包括大小写
“数据源”与“tnsnames.ora”中配置的一样,也即与“添加Windows的ODBC数据源”步骤中填写的一样
“访问接口字符串”,按照“uid=username;PWD=userpasswd”格式来填写,或者“ID=username;Password=userpasswd”也行,这里的username和userpasswd为登录所要连接的Oracle数据库所使用的用户名和密码;这里一定要填写,虽然在“安全性”选项卡中也会填写
3. 切换到“安全性”选项卡,填写用户名和密码,与上一步所填的用户名和密码一致
点击“确定”,完成
4. 查看Oracle中的数据
此时,在“链接服务器”下面,会出现刚刚创建的链接服务器,展开,可以看到所有的表和视图,但是只能看到表名,不能查看字段
要查询可以右键点击某表,选择:编写脚本为->Select 到->新查询编辑器窗口
五、 查询或更新Oracle数据库中的数据
亲测,我空间的日志
求采纳为满意回答。追问

离题了

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-05-29

错误提示的意思是该查询需要使用临时表空间,但是临时表空间满了且无法扩展,所以查询执行不下去了,报错。造成这一错误的原因基本上是: 查询所涉及的数据较大,临时空间较小且不能扩展。

所以,解决方法是:

1) 修改查询语句,将openquery的结果限制在有限范围内(没有实测过,想想应该是这样的吧)

2) 修改Oracle数据库设置,扩大临时表空间

 

SQL Server中execute可以传入参数调用连接数据库的查询,格式如下:

execute ('select * from table_name where field_1 = ? and field_2 = ?', parameter_value_1, parameter_value_2) at linked_database

其中,execute的第一个参数是连接数据库中查询语句,必须是目标数据库的语法,这里就是Oracle数据库的查询;field_1 = ?中的问号则是代表需要使用一个传入参数,必须在查询语句之后的参数中填写此参数值,就是parameter_value_1; 最后, at linked_database则指定在哪个连接数据库上执行。

所以,可以这样查询:

execute ('select * from YYYY.abc where year_month = ?', '201405') at XXXX

'201405'可以换成SQL Server的变量,如@yearMonth.

追问

谢谢大神,大神有办法把日期条件放在openquery么

追答

你可以直接将条件year_month放到openquery的查询语句中去的,但是无法将此查询条件参数化(指的是用SQL Server变量, 如此例中只能固定写成201405)。

select * from openquery(XXXX, 'select * from YYYY.abc where year_month=''201405''')

查询字符串中的单引号需要用两个单引号表示。

本回答被提问者和网友采纳
第2个回答  2014-09-10
把where放到openquery里面吧追问

那样语法错误了

相似回答