以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  拼接了一个sql语句如何传递到储存过程中生成临时表?  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=100846)

--  作者:happyft
--  发布时间:2017/5/19 15:50:00
--  拼接了一个sql语句如何传递到储存过程中生成临时表?
如果在窗口中拼接生成了一个sql语句比如

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

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

谢谢!

--  作者:有点色
--  发布时间:2017/5/19 15:52:00
--  

 直接新建表。

 

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


--  作者:HappyFt
--  发布时间: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有语法错误




--  作者:有点色
--  发布时间:2017/5/19 17:11:00
--  

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

 

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

 


--  作者:HappyFt
--  发布时间: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了.有没有其他办法,


--  作者:有点色
--  发布时间: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
--  发布时间:2017/5/19 17:42:00
--  
消息 102,级别 15,状态 1,过程 usp_Updatetb,第 10 行
\'Go\' 附近有语法错误。

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

--  作者:有点色
--  发布时间:2017/5/19 17:48:00
--  

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

 

 贴出你写的完整代码。


--  作者:HappyFt
--  发布时间: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,非全局的有没有办法实现


--  作者:有点蓝
--  发布时间:2017/5/19 18:01:00
--  
oledb对临时表的支持不好,经常无法接收存储过程中的临时表返回的数据。