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


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

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

帅哥哟,离线,有人找我吗?
happyft
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1944 积分:17953 威望: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
要如何传递,储存过程中代码应该怎么写?

谢谢!

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


加好友 发短信
等级:八尾狐 帖子:1944 积分:17953 威望: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有语法错误




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


加好友 发短信
等级:八尾狐 帖子:1944 积分:17953 威望: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了.有没有其他办法,


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


加好友 发短信
等级:八尾狐 帖子:1944 积分:17953 威望: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前面对结果有没有影响, 如果不影响,也没关系,就全部写在前面好了

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


加好友 发短信
等级:八尾狐 帖子:1944 积分:17953 威望: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,非全局的有没有办法实现


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


加好友 发短信
等级:八尾狐 帖子:1944 积分:17953 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2017/5/19 18:11:00 [显示全部帖子]

那就用个真实的表名,反正每次用完都删除掉,这样反反复复在数据库上新增表,又删除没关系吧,因为每执行一次就要生成删除一次.

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


加好友 发短信
等级:八尾狐 帖子:1944 积分:17953 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2017/5/20 12:22:00 [显示全部帖子]

用临时表是因为储存过程中后面还要用这个临时表连接很多其他的表更新数据用,
已经解决了,就是用全局临时表就没有问题。

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


加好友 发短信
等级:八尾狐 帖子:1944 积分:17953 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2017/5/20 18:28:00 [显示全部帖子]

新的问题,在前台执行储存过程时没有结果输出 ,也没有错误提示,问题出在哪里?
Dim cmd As New SQLCommand
cmd.ConnectionName = Mydata
Dim sql As String 
sql = " 'Se lect ''ZL1703-636'' as 来源单号,''B2601146'' as 产品编码,1000 as 数量 union all Se lect ''ZL1703-637'' as 来源单号,''B2601147'' as 产品编码,100 as 数量 ' "
cmd.CommandText = "Exec usp_tbover " & Sql
Dim dt As DataTable =  cmd.ExecuteReader
output.show(dt.DataRows.count)  命令窗口执行显示为0,实际上有两行数据
Tables("供应商_主表").DataSource  = dt

但同样的语句在sql的后台数据库测试又可以

图片点击可在新窗口打开查看此主题相关图片如下:截图20170520318935.png
图片点击可在新窗口打开查看

是不是因为储存过程传递参数时多个参数是用,号隔开,但我的拼接的sql语句中有多个,号在中间,但实际整句sql就是一个参数而已,传入的这个sql语句的正确格式应该怎样写才是?

谢谢!


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


加好友 发短信
等级:八尾狐 帖子:1944 积分:17953 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2017/5/22 8:24:00 [显示全部帖子]

有点色老师,这个帮忙看下,昨天弄了一天,都没有找到原因,看楼上,谢谢!

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


加好友 发短信
等级:八尾狐 帖子:1944 积分:17953 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2017/5/22 10:23:00 [显示全部帖子]

果然是加上set nocount on/off就可以了,谢谢!

 回到顶部
总数 14 1 2 下一页