1、调用 OPENROWSET 的方法事例代码:select * from OPENROWSET(SQLNCLI, server=127.0.0.1;uid=sa;pwd=8315679;database=bbs, select * from _category)OLE DB 错误:OLE DB 或 ODBC 错误发生这种问题是因为,SQL Server 2005 只提供对一组特定访问接口的进程内访问。SQLNCLI 是 SQL Server 2005 的一个新的本机 OLE DB 访问接口,它具有访问权。但是,SQLNCLI.1 是特定于版本的 SQLNCLI 访问接口,它不在访问接口的列表中。
2、因此,SQLNCLI.1 没有访问权。尽管 SQLNCLI 和 SQLNCLI.1 完全相同(因为 SQLNCLI 指向 SQLNCI.1) ,但 SQL Server 2005 并不能识别出它们是相同的。SQL Server 2005 会阻止对 SQLNCLI.1 的访问。 要解决此问题,请使用下列方法之一: 在 OLE DB 连接字符串中使用 SQLNCLI 代替 SQLNCLI.1。 在 SQL Server 中,将 SQLNCL.1 显式添加到具有进程内访问权的供应商列表中。 Sqloledb、SQLNCLI 都是可以的insert into openrowset( SQLOLEDB,
3、 127.0.0.1; sa; 8315679,bbs.dbo._category)(name,description)select name,description from _categorysp_addlinkedserver 创建一个链接的服务器,使其允许对分布式的、针对 OLE DB 数据源的异类查询进行访问。在使用 sp_addlinkedserver 创建链接的服务器之后,此服务器就可以执行分布式查询。如果链接服务器定义为 Microsoft SQL Server,则可执行远程存储过程。 语法 sp_addlinkedserver server = server , srvpro
4、duct = product_name , provider = provider_name , datasrc = data_source , location = location , provstr = provider_string , catalog = catalog 语法 sp_addlinkedsrvlogin rmtsrvname = rmtsrvname , useself = useself , locallogin = locallogin , rmtuser = rmtuser , rmtpassword = rmtpassword useself = useself
5、 决定用于连接到远程服务器的登录名称。useself 的数据类型为 varchar(8),默认设置为 TRUE。true 值指定 SQL Server 验证的登录使用其自己的凭据以连接到 rmtsrvname,而忽略 rmtuser 和 rmtpassword 参数。false 值指定 rmtuser 和 rmtpassword 参数用来连接到特定 locallogin 的 rmtsrvname。如果 rmtuser 和 rmtpassword 也设置为 NULL,则连接链接服务器不需使用任何登录或密码。对于 Windows NT 身份验证登录而言,useself 为 true 则无效,除非
6、Microsoft Windows NT 环境支持安全帐户委托,并且,提供程序支持 Windows 身份验证(此时不再需要创建值为 true 的映射,不过创建仍然有效)。 locallogin = locallogin 本地服务器上的登录。locallogin 的数据类型为 sysname,默认设置为 NULL。NULL 值指定此条目将应用于所有连接到 rmtsrvname 的本地登录。如果值不为 NULL,则 locallogin 可以是一个 SQL Server 登录或 Windows NT 用户。必须授予 Windows NT 用户直接访问 SQL Server 或通过其作为已授予访问权
7、限的组的成员来访问 SQL Server 的权限。 不同服务器数据库之间的数据操作-创建链接服务器 exec sp_addlinkedserver ITSV , , SQLOLEDB , 远程服务器名或 ip 地址 exec sp_addlinkedsrvlogin ITSV , false ,null, 用户名 , 密码 -查询示例 select * from ITSV.数据库名.dbo.表名 -导入示例 select * into 表 from ITSV.数据库名.dbo.表名 -以后不再使用时删除链接服务器 exec sp_dropserver ITSV , droplogins -连接
8、远程/局域网数据(openrowset/openquery/opendatasource) -1、openrowset -查询示例 select * from openrowset( SQLOLEDB , sql 服务器名 ; 用户名 ; 密码 ,数据库名.dbo.表名) -生成本地表 select * into 表 from openrowset( SQLOLEDB , sql 服务器名 ; 用户名 ; 密码 ,数据库名.dbo.表名) -把本地表导入远程表 insert openrowset( SQLOLEDB , sql 服务器名 ; 用户名 ; 密码 ,数据库名.dbo.表名) sel
9、ect *from 本地表 -更新本地表 update b set b.列 A=a.列 A from openrowset( SQLOLEDB , sql 服务器名 ; 用户名 ; 密码 ,数据库名.dbo.表名)as a inner join 本地表 b on a.column1=b.column1 -openquery 用法需要创建一个连接 -首先创建一个连接创建链接服务器 exec sp_addlinkedserver ITSV , , SQLOLEDB , 远程服务器名或 ip 地址 -查询 select * FROM openquery(ITSV, SELECT * FROM 数据库
10、.dbo.表名 ) -把本地表导入远程表 insert openquery(ITSV, SELECT * FROM 数据库.dbo. 表名 ) select * from 本地表 -更新本地表 update b set b.列 B=a.列 B FROM openquery(ITSV, SELECT * FROM 数据库.dbo.表名 ) as a inner join 本地表 b on a.列 A=b.列 A -3、opendatasource/openrowset SELECT * FROM opendatasource( SQLOLEDB , Data Source=ip/ServerNa
11、me;User ID=登陆名;Password=密码 ).test.dbo.roy_ta -把本地表导入远程表 insert opendatasource( SQLOLEDB , Data Source=ip/ServerName;User ID=登陆名;Password=密码 ).数据库.dbo.表名 select * fromexec sp_addlinkedserver srv_lnk,SQLOLEDB,192.168.0.111 exec sp_addlinkedsrvlogin srv_lnk,false,null,sa,7852 select count(*) from srv_l
12、nk.datainfodb.dbo.userinfo exec sp_dropserver srv_lnk,droplogins/*-删除远程服务器-*/ 1.通过行集函数 opendatasource要求: 本地安装 Oracle 客户端select * from opendatasource(MSDAORA, Data Source=XST4;User ID=manager;Password=sjpsjsjs)MISD.PBCATCOL其中,MSDAORA 是 OLEDB FOR Oracle 的驱动,2.使用链接服务器方式EXEC SP_ADDLINKEDSERVERserver=mylinkedserver, -链接服务器名称srvproduct=Oracle, -固定provider=MSDAORA, -固定datasrc=XST4 -Oracle 本地服务名alter table 表名 add 列名 数据类型