Foxtable(狐表)用户栏目专家坐堂 → 拼接了一个sql语句如何传递到储存过程中生成临时表?


  共有3507人关注过本帖树形打印复制链接

主题:拼接了一个sql语句如何传递到储存过程中生成临时表?

帅哥,在线噢!
happyft
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1930 积分:17564 威望:0 精华:0 注册:2014/7/29 19:09:00
拼接了一个sql语句如何传递到储存过程中生成临时表?  发帖心情 Post By:2017/5/19 15:50:00 [只看该作者]

如果在窗口中拼接生成了一个sql语句比如

se lect qg001,a001
union all
se lect qg002,a002

如何把上面这个语句传入到储存过程中生成一个临时表#temp1
要如何传递,储存过程中代码应该怎么写?

谢谢!

 回到顶部
帅哥哟,离线,有人找我吗?
有点色
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2017/5/19 15:52:00 [只看该作者]

 直接新建表。

 

 select * into (#temp1) from (sql语句)


 回到顶部
帅哥,在线噢!
HappyFt
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1930 积分:17564 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2017/5/19 16:57:00 [只看该作者]

SE LECT * INTO #temp1 FROM (SE LECT 'qg001' AS 来源单号, 'a001' AS 产品编码 UNION ALL SE LECT 'qg002', 'a002') a
上面直接写是没有问题,但是要传入到储存过程中要怎么写
CREATE PROCEDURE [dbo].[usp_Updatetb]
(
     @sqltb NVARCHAR(800)
)
AS
BEGIN
  DE CLARE @sql NVARCHAR(MAX);
  SE T @sql = 'SE LECT * INTO #temp1 FROM (' + @sqltb + ')'
  EXEC sp_executesql @sql
  se lect * from #temp1
END

上面这样写测试总不对,要不提示对像#temp1无效,要么关键字se lect有语法错误




 回到顶部
帅哥哟,离线,有人找我吗?
有点色
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2017/5/19 17:11:00 [只看该作者]

 单引号的问题,你合成的sql语句有问题

 

SET @sql = "SELECT * INTO #temp1 FROM (" + @sqltb + ")"

 


 回到顶部
帅哥,在线噢!
HappyFt
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1930 积分:17564 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2017/5/19 17:19:00 [只看该作者]

不是,是括号后面要加个别名才可以,现在可以了
BEGIN
    DECLARE @sql NVARCHAR(MAX);
    IF OBJECT_ID('tempdb..#temp1') IS NOT NULL
        DROP TABLE #temp1;
    SET @sql = 'SE LECT * INTO #temp1 FROM (' + @sqltb + ') a;
   SE LECT *
    FROM #temp1';
    EXEC sp_executesql @sql;


END;

现在问题是,如果生成临时表,后面还有其他功能的sql语句,必须都要写在EXEC sp_executesql @sql这句这前,如果红色那句写在后面,就提示找不到#temp1了.有没有其他办法,


 回到顶部
帅哥哟,离线,有人找我吗?
有点色
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2017/5/19 17:34:00 [只看该作者]

BEGIN
    DECLARE @sql NVARCHAR(MAX);
    IF OBJECT_ID('tempdb..#temp1') IS NOT NULL
        DROP TABLE #temp1;
    SET @sql = 'SELECT * INTO #temp1 FROM (' + @sqltb + ') a'
    EXEC sp_executesql @sql;
    Go;
     
   SE LECT * FROM #temp1;
END;

 回到顶部
帅哥,在线噢!
HappyFt
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1930 积分:17564 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2017/5/19 17:42:00 [只看该作者]

消息 102,级别 15,状态 1,过程 usp_Updatetb,第 10 行
'Go' 附近有语法错误。

都写在EXEC sp_executesql @sql前面对结果有没有影响, 如果不影响,也没关系,就全部写在前面好了

 回到顶部
帅哥哟,离线,有人找我吗?
有点色
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2017/5/19 17:48:00 [只看该作者]

 不是这个前后的意思。你写在前面,是你的语句在@sql里面,执行的时候就一起执行了。

 

 贴出你写的完整代码。


 回到顶部
帅哥,在线噢!
HappyFt
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1930 积分:17564 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2017/5/19 17:59:00 [只看该作者]

完整代码就是这样的啊
ALTER PROCEDURE [dbo].[usp_Updatetb] (@sqltb NVARCHAR(800))
AS
BEGIN
   DECLARE @sql NVARCHAR(MAX);
    IF OBJECT_ID('tempdb..#temp1') IS NOT NULL
        DROP TABLE #temp1;
    SE T @sql = 'SE LECT * INTO #temp1 FROM (' + @sqltb + ') a'
    EXEC sp_executesql @sql;
     Go;
   SE LECT * FROM #temp1;
END;
现在就是测试查询表放在后面都不可以,是不是因为临时表,执行上面那个语句结束后就自动删除了,

应该是这个原因,我将上面的临时表改为全局的就没问题,##temp1,非全局的有没有办法实现


 回到顶部
帅哥,在线噢!
有点蓝
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110581 积分:562801 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2017/5/19 18:01:00 [只看该作者]

oledb对临时表的支持不好,经常无法接收存储过程中的临时表返回的数据。

 回到顶部
总数 23 1 2 3 下一页