结果集插入临时表的问题

kdg2000 2006-08-15 12:58:44

Create Table TEST
(TypeChar(1),
Statedatetime)
Insert TEST
Select 'A','2006-5-10 00:01:01' Union All
Select 'A','2006-5-1 00:05:01' Union All
Select 'A','2006-5-9 00:06:01' Union All
Select 'B','2006-5-1 00:03:01' Union All
Select 'B','2006-5-5 00:08:01' Union All
Select 'B','2006-5-1 00:09:01' Union All
Select 'C','2006-5-5 00:11:01' Union All
Select 'C','2006-5-9 00:02:01'
--select * from test
GO
--State不固定的情況下的
Declare @S Varchar(8000)
Select @S=''
Select @S=@S+',SUM(Case Convert(Varchar(10),state,120) When '''+state+ '''Then 1 Else 0 End) As ' + '[' + state + ']'
From (Select Distinct Convert(Varchar(10),state,120) As state From TEST ) A Order By state

Select @S='Select Type'+@S+' From TEST Group By Type'
EXEC(@S)
Drop Table TEST
GO

----------------------------------------
如上所示,如果我想把以上结果集插入到临时表#T中

改为 如:Select @S='Select Type'+@S+' into #T From TEST Group By Type'

这样的话运行EXEC(@S)的话 并没有插入到#T中 只提示影响的行数,

可是如果把@S print出来后 再把得到的sql语句单独运行 就可以

如何解决
...全文
311 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzhs 2006-08-15
  • 打赏
  • 举报
回复
这么多冒牌,眼都花了。
不过回复还是值得看的。~~~`
i9988 2006-08-15
  • 打赏
  • 举报
回复
我的回复对楼主没用,当没回复好了
i9988 2006-08-15
  • 打赏
  • 举报
回复
create table #t(
.....
)

insert #t
exec (@s)

select * from #t
...
drop table #t

fcuandy 2006-08-15
  • 打赏
  • 举报
回复
说到最后还是临时表类型和进程的问题
fcuandy 2006-08-15
  • 打赏
  • 举报
回复
我想楼主的意思是将数据存入临时表还要进行一系列操作.如果像你上面这样几个简单步骤的话,
那么楼主的这句话

EXEC(@S + ';SELECT * FROM #t;') --就可以了
kdg2000 2006-08-15
  • 打赏
  • 举报
回复
十分感谢 我试试看
hellowork 2006-08-15
  • 打赏
  • 举报
回复
Select @S='Select Type'+@S+' into #T From TEST Group By Type /*注意此行末尾没有单引号*/
select * from #T /*显示汇总结果.注意此行没有单引号*/
select sum([2006-05-01]) from #T' /*对汇总列求和.注意此行有单引号,是整个@S字符串的结尾*/
PRINT @S /*请楼主PRINT一下@S就知道了.*/
EXEC(@S) /*执行@S字符串*/

这里@S就相当于:
select Type ...into #T from Test Group by type
select * from #T
select sum([2006-05-01]) from #T
hellowork 2006-08-15
  • 打赏
  • 举报
回复
我已经在EXEC(@S)的后面继续写了 select * from #T
-----------------------------------------------------------------------------------
请楼主注意我一楼的写法,select * from #T不能在EXEC(@S)之后独立执行,它必须是字符串,与@S连接.就象这样:
Select @S='Select Type'+@S+' into #T From TEST Group By Type ' +
'select * from #T '
简化后就是一楼的写法.
fcuandy 2006-08-15
  • 打赏
  • 举报
回复
不是没插到#t中,而是受到进程的影响.
exec内外部语句执行时编译空间不同,进程也不同,当创建临时表后,到外部语句执行
select * from #t时,内部进程中断,所以无法访问.

你试一下
exec('..... into ##t from ...')
select * from ##t
用全局临时表就知道了.

或者写一个实表,再drop实表
exec('.... into tmp from ..')
select * from tmp
drop table tmp
hellowork 2006-08-15
  • 打赏
  • 举报
回复
我已经在EXEC(@S)的后面继续写了 select * from #T
但是提示没有#T表,实际上就是没有插入成功
----------------------------------------------------------------------------------
不会的,只要EXEC执行成功,#T就会存在,即使结果集是空的.请楼主注意select * from #T是@S的一部分,不是单独的.
hellowork 2006-08-15
  • 打赏
  • 举报
回复
Select @S='Select Type'+@S+' into #T From TEST Group By Type
select * from #T'
EXEC(@S)
本课程目前总计105课时,并且不定期的进行新知识点的补充,目的是打造一部围绕MySQL的全体系课程。课程涵盖11大章节,分别是:第1章基础&技巧:这部分的重点是会讲解一些容易被开发人员忽略的技巧,例如utf8mb4字符集问题、如何使用外部临时提高查询效率、快速创建同结构及快速复制数据、截断和删除数据使用和差异、以及怎样使用help语句查看帮助文档。第2章六大数据类型:这部分的重点是对MySQL的8种数字类型、5种日期和时间类型、10种字符串类型、枚举类型、集合类型和时间戳类型的区别和使用进行深入讲解。第3章数据库函数大全:MySQL中有上百种函数之多,使用函数可以快速的解决我们很多开发问题,但是由于我们掌握的函数不够多,往往没有办法实际应用,本章节重点是让你掌握更多好用而你不知道的函数使用。第4章数据库引擎精讲:本章节带您深入到MySQL的体系架构,深入理解innoDB、MyISAM、MEMORY、ARCHIVE引擎的区别和使用原则。第5章数据库索引精讲:索引是保障我们查询效率的重点,本章节从逻辑存储和物理存储的底层入手,深入剖析索引的存储结构和查找方法,掌握聚簇索引、非聚簇索引、前缀索引等的存取原理和使用技巧。第6章调优工具:工欲善其事必先利其器,本章节带你掌握读写比例查询、缓存设置、执行计划和Profile调优工具。第7章参数调优和索引调优:怎么样让SQL执行的更快、数据库的性能更强,怎样充分利用索引进行不断的优化。本章节会为您讲解16种MySQL的优化策略。第8章SQL调优:SQL语句是我们日常使用的重点,怎么样写出一手高性能的SQL语句,其实是具有一定技巧的,本章节讲解8种优化策略,让数据SQL执行性能更强。第9章分库分:在面对海量数据的时候单和单个数据库的性能始终会存在瓶颈,本章节为您讲解分库分的原理和技巧,怎么样使用Merge引擎分、深入掌握MySQL数据库分区的能力。第10章高可用架构和安全管理:本部分涵盖MySQL的高可用架构,主备架构、主从架构、主从从架构、互为主从架构。数据的同步复制、半同步复制、异步复制。主从复制原理和主从延迟的问题,以及在管理和开发层面怎样保证数据库安全。第11章MySQL日志:对MySQL的7种日志进行讲解,包括errorlog错误日志、general log查询日志、slow log慢日志、binlog 二进制日志、redlog重做日志。课程会附带配套文档和SQL脚本。有问题可以直接联系作者,24小时线上答疑。

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧