以文本方式查看主题 - 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对临时表的支持不好,经常无法接收存储过程中的临时表返回的数据。 |