Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 1121|回复: 0

sql INSERT EXEC 语句不能嵌套 解决方案

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-7-15 17:10:24 | 显示全部楼层 |阅读模式
    存储过程C返回一个结果集,存储过程B用INSERT/EXEC PROC将C返回的结果集存入一个临时表中并返回一个结果集,
    如果存储过程A用INSERT/EXEC PROC再将B的结果集存入一个临时表,这时会报错:INSERT EXEC 语句不能嵌套。
    解决方法就是:
    将过程B的INSERT/EXEC PROC语句替换为
    insert into #T
    SELECT *  
    FROM OPENROWSET('MSDASQL',
           'DRIVER={SQL Server};SERVER=192.168.0.1;UID=sa;PWD=111111;Initial Catalog=Pubs',
           'EXEC pubs.dbo.pc') AS A
    即可,不过好像在过程A中要先执行一下过程B才行,即在A过程的语句INSERT/EXEC PROC的前面加上exec B。
    只要过程B先执行一次,以后可以不用再执行A也能够正常执行了,这样可将过程B设置为启动时执行即可(用系统过程sp_procoption设置)
    ---A.建一个连接到自身数据库的连接服务器
    ---开启该连接服务器的RPC功能,右击该连接服务器,单击属性,单击服务器选项,然后选中RPC和RPC输出项即可
    EXEC sp_addlinkedserver 
     @server  = 'self', 
     @srvproduct  = '', 
     @provider  = 'MSDASQL',
     @datasrc  = NULL,
     @location  = NULL,
     @provstr  = 'DRIVER={SQL Server};Server=(local);Initial Catalog=master;uid=sa;pwd=123;'
     
    create proc pC
    as
    select top 10 * from authors
    drop proc pB
    create proc pB
    as 
    select  * into #T from authors where 1=0
    --insert into #T exec pc
    insert into #T
    SELECT * 
    FROM OPENROWSET('MSDASQL',
           'DRIVER={SQL Server};SERVER=192.168.0.1;UID=sa;PWD=111111;Initial Catalog=Pubs',
           'EXEC pubs.dbo.pc') AS A
    select * from #T
    create proc pA
    as 
    select  * into #T from authors where 1=0
    exec pb
    insert into #T exec pB
    select * from #T
     
     
    exec pB
    exec pA
     

     

    或者用下面的方法解决:

     
    ---B.创建链接服务器
    ---用SQL命令建立与本Server的Linked Server.
    Exec   sp_addlinkedserver     '172.26.40.8','','SQLOLEDB','172.26.40.8'   
    Exec   sp_addlinkedsrvlogin   '172.26.40.8','false',null,'sa','123'   
    exec sp_serveroption '172.26.40.8','rpc','true'
    exec sp_serveroption '172.26.40.8','rpc out','true'  --这个允许调用链接服务器上的存储过程
     
    
    调用示例如下,
    
    Create Table #TempCheckResult(iResult varchar(12),iMessage nvarchar(200))
    Declare @iSQL nvarchar(200)
    Set @iSQL= 'Exec usp_PAL_CheckCompUsability '+'''SW89080571GN'''+',''W8905001U632A'''+',''Repair'''
    Insert Into #TempCheckResult EXEC(@iSQL) ---此句会报错:An INSERT EXEC statement cannot be nested.
    Insert Into #TempCheckResult EXEC [172.26.40.6].PAL_COMPSN_P80.dbo.sp_executesql @iSQL ---@iSQL --须为nvarchar,varchar会报错

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-23 04:25 , Processed in 0.062142 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表