27,582
社区成员




Declare @ip varchar(20)
Declare @t TABLE( aa int, bb varchar(20) )
set @ip = '192.168.1.85'
insert into @t select aa,bb from openrowset( 'SQLOLEDB', @ip; 'sa'; '',test.dbo.test)
select * from @t
Declare @ip varchar(20)
DECLARE @sql NVARCHAR(4000)
set @ip = '192.168.1.85'
SET @sql = 'select aa, bb from openrowset( ''SQLOLEDB'', '''+ @ip +'''; ''sa''; '''',test.dbo.test)'
INSERT INTO test(aa,bb) EXEC(@sql)
SELECT * FROM test
/*
该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分布式事务。
[OLE/DB provider returned message: 新事务不能登记到指定的事务处理器中。 ]
OLE DB 错误跟踪[OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a]。
*/
use test
create table test(aa int,bb varchar(10))
insert test
select 1,'BBBBBB' union all
select 2,'adsfas' union all
select 3,'WWWWsd'
go
Declare @ip varchar(20)
Declare @t TABLE( aa int, bb varchar(20) )
DECLARE @sql NVARCHAR(4000)
set @ip = '192.168.2.100'
SET @sql = 'select aa, bb from openrowset( ''SQLOLEDB'', '''+ @ip +'''; ''sa''; ''123'',test.dbo.test)'
INSERT INTO @t EXEC(@sql)
SELECT * FROM @t
drop table test
(3 row(s) affected)
(3 row(s) affected)
aa bb
----------- --------------------
1 BBBBBB
2 adsfas
3 WWWWsd
(3 row(s) affected)
不同服务器数据库之间的数据操作
--创建链接服务器
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'
--连接远程/局域网数据(openrowset/openquery/opendatasource)
--1、openrowset
--查询示例
select * from openrowset('SQLOLEDB' , 'sql服务器名' ; '用户名' ; '密码' , 数据库名.dbo.表名)
--生成本地表
select * into 表 from openrowset('SQLOLEDB' , 'sql服务器名' ; '用户名' ; '密码' , 数据库名.dbo.表名)
--把本地表导入远程表
insert openrowset( 'SQLOLEDB' , 'sql服务器名' ; '用户名' ; '密码' , 数据库名.dbo.表名)
select *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 数据库.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/ServerName ; User ID=登陆名 ; Password=密码').test.dbo.roy_ta
--把本地表导入远程表
insert opendatasource('SQLOLEDB' , 'Data Source=ip/ServerName ; User ID=登陆名 ; Password=密码').数据库.dbo.表名
select * from 本地表
Declare @ip varchar(20)
Declare @t TABLE( aa int, bb varchar(20) )
Declare @sql varchar(4000)
set @ip = '192.168.1.85'
set @sql = 'select aa, bb from openrowset( ''SQLOLEDB'', '''+ @ip +'''; ''sa''; ''sa密码'',test.dbo.test)'
insert into @t exec (@sql)
select * from @t
CREATE PROCEDURE proc_test
@ip VARCHAR(20)
AS
BEGIN
DECLARE @t TABLE(aa int, bb varchar(20))
DECLARE @sql NVARCHAR(4000)
SET @sql = 'select aa, bb from openrowset( ''SQLOLEDB'', '''+ @ip +'''; ''sa''; ''123456'',test.dbo.test)'
--PRINT @sql
INSERT INTO @t EXEC(@sql)
SELECT * FROM @t
END
Declare @ip varchar(20)
Declare @t TABLE( aa int, bb varchar(20) )
DECLARE @sql NVARCHAR(4000)
set @ip = '192.168.1.85'
SET @sql = 'select aa, bb from openrowset( ''SQLOLEDB'', '''+ @ip +'''; ''sa''; '''',test.dbo.test)'
INSERT INTO @t EXEC(@sql)
SELECT * FROM @t
/*
服务器: 消息 197,级别 15,状态 1,行 9
无法在向表插入变量时将 EXECUTE 用作源。
*/