select * into 表 from openrowset( 'SQLOLEDB', 'sql服务器名'; '用户名 '; '密码','exec 存儲過程')
--功能概述:动态sql语句基本语法 1 :普通SQL语句可以用Exec执行 eg: Select * from tableName Exec('select * from tableName') Exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N 2:字段名,表名,数据库名之类作为变量时,必须用动态SQL eg: declare @fname varchar(20) set @fname = 'FiledName' Select @fname from tableName -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。 Exec('select ' + @fname + ' from tableName') -- 请注意 加号前后的 单引号的边上加空格 当然将字符串改成变量的形式也可 declare @fname varchar(20) set @fname = 'FiledName' --设置字段名 declare @s varchar(1000) set @s = 'select ' + @fname + ' from tableName' Exec(@s) -- 成功 exec sp_executesql @s -- 此句会报错 declare @s Nvarchar(1000) -- 注意此处改为nvarchar(1000) set @s = 'select ' + @fname + ' from tableName' Exec(@s) -- 成功 exec sp_executesql @s -- 此句正确 3. 输出参数 declare @num int, @sqls nvarchar(4000) set @sqls='select count(*) from tableName' exec(@sqls) --如何将exec执行结果放入变量中? declare @num int, @sqls nvarchar(4000) set @sqls='select @a=count(*) from tableName ' exec sp_executesql @sqls,N'@a int output',@num output select @num
返回的结构可预知:insert 表(定义的结构) exec 存储过程返回的结构不可预知select * into 表名 from openrowset(....)
--源表数据 select * from tb /* id deptid brokerid brokername client clientname bale cost ----- ------ -------- ---------- ------ ---------- ---- ---------- 1001 900 101 张三 1001 张三 A 0.2 1001 900 101 张三 1001 张三 B 0.2 1001 900 101 张三 1001 张三 C 0.2 1001 900 101 张三 1002 李四 A 0.3 */ --创建存储过程 if object_id('p','p') is not null drop proc p go create proc p as declare @sql nvarchar(4000) set @sql='select * from tb' exec(@sql) go --动态插入新表 declare @sql nvarchar(4000) set @sql='select * into newtb from openrowset(''SQLOLEDB'',''server=serverName;database=DBName;uid=sa;pwd=yourpassword;'',''exec p'') a' exec(@sql) --查看新表 select * from newtb /* id deptid brokerid brokername client clientname bale cost ----- ------ -------- ---------- ------ ---------- ---- ---------- 1001 900 101 张三 1001 张三 A 0.2 1001 900 101 张三 1001 张三 B 0.2 1001 900 101 张三 1001 张三 C 0.2 1001 900 101 张三 1002 李四 A 0.3 */drop table newtb
如果系统提示需要启用“Ad Hoc Ditributed Queries”,则可运行下列代码打开该配置: sp_configure 'show advanced options',1 go reconfigure gosp_configure 'Ad Hoc Distributed Queries',1 go reconfigure go
你好!wufeng4552 你的方法在我本机上可以,但到了服务器上他报这样的错误: 链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI" 返回了消息 "由于打开服务器连接过程中的延迟,无法完成登录过程"。 链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI" 返回了消息 "无效的连接字符串属性"。 消息 7303,级别 16,状态 1,第 1 行 无法初始化链接服务器 "(null)" 的 OLE DB 访问接口 "SQLNCLI" 的数据源对象。请问有什么解决办法吗?谢谢了!
--try: select * from openrowset('SQLOLEDB', 'ServerName'; 'sa'; 'password','exec DBName.dbo.SPName') a
原来还有这么多人回复啊 嘿嘿 好多高手啊 我用了OPENROWSET试了以下,请问wufeng4552和szx1999请问在我本机上可以,但到了服务器上他报这样的错误: 链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI" 返回了消息 "由于打开服务器连接过程中的延迟,无法完成登录过程"。 链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI" 返回了消息 "无效的连接字符串属性"。 消息 7303,级别 16,状态 1,第 1 行 无法初始化链接服务器 "(null)" 的 OLE DB 访问接口 "SQLNCLI" 的数据源对象。请问有什么解决办法吗?谢谢了!我很急啊
1 :普通SQL语句可以用Exec执行 eg: Select * from tableName
Exec('select * from tableName')
Exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N 2:字段名,表名,数据库名之类作为变量时,必须用动态SQL eg:
declare @fname varchar(20)
set @fname = 'FiledName'
Select @fname from tableName -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。
Exec('select ' + @fname + ' from tableName') -- 请注意 加号前后的 单引号的边上加空格 当然将字符串改成变量的形式也可
declare @fname varchar(20)
set @fname = 'FiledName' --设置字段名 declare @s varchar(1000)
set @s = 'select ' + @fname + ' from tableName'
Exec(@s) -- 成功
exec sp_executesql @s -- 此句会报错 declare @s Nvarchar(1000) -- 注意此处改为nvarchar(1000)
set @s = 'select ' + @fname + ' from tableName'
Exec(@s) -- 成功
exec sp_executesql @s -- 此句正确 3. 输出参数
declare @num int,
@sqls nvarchar(4000)
set @sqls='select count(*) from tableName'
exec(@sqls)
--如何将exec执行结果放入变量中? declare @num int,
@sqls nvarchar(4000)
set @sqls='select @a=count(*) from tableName '
exec sp_executesql @sqls,N'@a int output',@num output
select @num
select * from tb
/*
id deptid brokerid brokername client clientname bale cost
----- ------ -------- ---------- ------ ---------- ---- ----------
1001 900 101 张三 1001 张三 A 0.2
1001 900 101 张三 1001 张三 B 0.2
1001 900 101 张三 1001 张三 C 0.2
1001 900 101 张三 1002 李四 A 0.3
*/
--创建存储过程
if object_id('p','p') is not null
drop proc p
go
create proc p
as
declare @sql nvarchar(4000)
set @sql='select * from tb'
exec(@sql)
go
--动态插入新表
declare @sql nvarchar(4000)
set @sql='select * into newtb from openrowset(''SQLOLEDB'',''server=serverName;database=DBName;uid=sa;pwd=yourpassword;'',''exec p'') a'
exec(@sql)
--查看新表
select * from newtb
/*
id deptid brokerid brokername client clientname bale cost
----- ------ -------- ---------- ------ ---------- ---- ----------
1001 900 101 张三 1001 张三 A 0.2
1001 900 101 张三 1001 张三 B 0.2
1001 900 101 张三 1001 张三 C 0.2
1001 900 101 张三 1002 李四 A 0.3
*/drop table newtb
sp_configure 'show advanced options',1
go
reconfigure
gosp_configure 'Ad Hoc Distributed Queries',1
go
reconfigure
go
链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI" 返回了消息 "由于打开服务器连接过程中的延迟,无法完成登录过程"。
链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI" 返回了消息 "无效的连接字符串属性"。
消息 7303,级别 16,状态 1,第 1 行
无法初始化链接服务器 "(null)" 的 OLE DB 访问接口 "SQLNCLI" 的数据源对象。请问有什么解决办法吗?谢谢了!
select * from openrowset('SQLOLEDB', 'ServerName'; 'sa'; 'password','exec DBName.dbo.SPName') a
链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI" 返回了消息 "由于打开服务器连接过程中的延迟,无法完成登录过程"。
链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI" 返回了消息 "无效的连接字符串属性"。
消息 7303,级别 16,状态 1,第 1 行
无法初始化链接服务器 "(null)" 的 OLE DB 访问接口 "SQLNCLI" 的数据源对象。请问有什么解决办法吗?谢谢了!我很急啊
select * from openrowset('SQLOLEDB', 'ServerName'; 'sa'; 'password','exec DBName.dbo.SPName')
声明的时候指定,而不是在写动态SQL的时候DBName.dbo.SPName?
谢谢了。