避免创建表的情况下,执行存储过程插入临时表
2014-12-10 15:15
309 查看
一般情况下,我们要将存储过程的结果集插入临时表的时候,需要以下步骤
Create table #temptable(column)。。。。
insert into #temptable
exec yoursp
这样做起来很烦琐,如果结果集有很多列,那就更痛苦了。
今天介绍一个灵活的办法
脚本如下:
这样就可以将结果集插入到临时表中,而不需要新创建表结构。
到这里还没有完,如果我们执行以下的语句
EXEC ('DBCC IND(DBTrain,Department8,-1)')
如果在Transact-SQL 中执行是正常的,但是放到OPENROWSET中,
则会出现错误提示:
Msg 7357, Level 16, State 2, Line 2
Cannot process the object " EXEC ('DBCC IND(DBTrain,Department8,-1)')". The OLE DB provider "SQLNCLI10" for linked server "(null)" indicates that either the object has no columns or the current user does not have permissions on that object.
要解决这个问题就要用到
SET FMTONLY OFF;
当 SET FMTONLY 为 ON 时,将不对行进行处理,也不将行作为请求的结果发送到客户端,只返回描述列信息的元数据;
在OLE DB Source中,需要显式的设置SET FMTONLY = OFF,来返回结果行给客户端
Create table #temptable(column)。。。。
insert into #temptable
exec yoursp
这样做起来很烦琐,如果结果集有很多列,那就更痛苦了。
今天介绍一个灵活的办法
脚本如下:
exec sp_configure 'show advanced options',1 reconfigure exec sp_configure 'Ad Hoc Distributed Queries',1 reconfigure --SET FMTONLY OFF IF OBJECT_ID('tempdb..#t') IS NOT NULL DROP TABLE #t GO SELECT * INTO #t FROM OPENROWSET( 'SQLNCLI10','DRIVER={SQL Server};SERVER=dbserver;UID=userid;PWD=password;Initial Catalog=DBTrain',' exec DBTrain..sp_depends multiresult') SELECT * FROM #t SQLNCLI在SqlServer2005以上才能使用 sqlserver 2008 的 provider 为:SQL Server Native Client 10.0 OLE DB Provider <标准连接>字符串为:Provider=SQLNCLI10;Server=myServerAddress;Database=myDataBase;Uid=myUsername; Pwd=myPassword; <信任连接>字符串为:Provider=SQLNCLI10;Server=myServerAddress;Database=myDataBase; Trusted_Connection=yes; 连接到数据库的具体实例:Provider=SQLNCLI10;Server=myServerName\theInstanceName;Database=myDataBase; Trusted_Connection=yes;
这样就可以将结果集插入到临时表中,而不需要新创建表结构。
到这里还没有完,如果我们执行以下的语句
EXEC ('DBCC IND(DBTrain,Department8,-1)')
如果在Transact-SQL 中执行是正常的,但是放到OPENROWSET中,
则会出现错误提示:
Msg 7357, Level 16, State 2, Line 2
Cannot process the object " EXEC ('DBCC IND(DBTrain,Department8,-1)')". The OLE DB provider "SQLNCLI10" for linked server "(null)" indicates that either the object has no columns or the current user does not have permissions on that object.
要解决这个问题就要用到
SET FMTONLY OFF;
SELECT * INTO #t FROM OPENROWSET( 'SQLNCLI10','DRIVER={SQL Server};SERVER=shasapp62;UID=sasalesbudget;PWD=Sanofi2011;Initial Catalog=DBTrain',' SET FMTONLY OFF; EXEC (''DBCC IND(DBTrain,Department8,-1)'')')
当 SET FMTONLY 为 ON 时,将不对行进行处理,也不将行作为请求的结果发送到客户端,只返回描述列信息的元数据;
在OLE DB Source中,需要显式的设置SET FMTONLY = OFF,来返回结果行给客户端
相关文章推荐
- 关于sql server 在存储过程中创建临时表,并往临时表中插入数据时出现乱码的问题
- 执行远程存储过程并插入到临时表中
- sqlserver 创建对某个存储过程执行情况的跟踪
- Oracle存储过程动态创建临时表/存储过程执行权限问题--AUTHID CURRENT_USER
- 学习笔记:查看存储过程执行情况等
- JDBC执行存储过程的四种情况
- 当用new创建对象时(无继承和有继承两种情况下)虚拟机的执行过程
- 执行存储过程 /创建存储过程:
- Informix创建执行和删除带参数的存储过程实例
- JDBC执行存储过程的四种情况
- Informix创建执行和删除带参数的存储过程实例
- 在存储过程中创建一临时表
- 在存储过程中创建临时表
- Informix创建执行和删除带参数的存储过程实例
- .NET调用osql.exe执行sql脚本创建表和存储过程
- 如何将存储过程执行后的结果集放入临时表
- 以含临时表的存储过程创建类型化数据集时报错
- mysql,dos下执行SQL语句创建存储过程出错ERROR 1064 (42000):
- [VB.NET]点net写client程序传递参数给mssql存储过程insert,为什么要反复执行客户端代码才能成功insert,怎么才能使客户端插入记录操作变得稳定呢?
- DB2存储过程--创建临时表,返回临时表集合