SQL Server中无法将WITH ROWS子句结果插入临时表求助
解决临时表插入失败的问题
我来帮你搞定这个临时表插入的问题!你的核心问题在于临时表#tempTest没有预先定义结构,而且Insert语句中CTE的用法不符合语法要求,下面给你两种可行的解决方案:
方法一:先创建临时表,再插入数据
先明确临时表的列结构(你的查询返回的是整数类型的分钟差值,所以定义一个int类型的列即可),再结合CTE完成插入:
IF OBJECT_ID('tempdb..#tempTest') IS NOT NULL DROP TABLE #tempTest -- 先创建临时表,定义列结构 CREATE TABLE #tempTest ( DiffMinutes INT ) -- 结合CTE插入数据 WITH rows AS ( SELECT *, ROW_NUMBER() OVER (ORDER BY [発生時刻]) AS rn FROM [PROC_MN].[dbo].[TBL_FINISH_STATUS] WHERE PO_NO='GV12762' AND 発生時刻 BETWEEN '2018/03/16' AND '2018/03/18' AND [加工内容]='Bonding' ) INSERT INTO #tempTest (DiffMinutes) SELECT DATEDIFF(minute, mc.[発生時刻], mp.[発生時刻]) FROM rows mc JOIN rows mp ON mc.rn = mp.rn - 1
方法二:用SELECT INTO直接创建并插入数据(更简洁)
这种方式不需要提前创建临时表,SQL会自动根据查询结果的字段类型生成临时表结构:
IF OBJECT_ID('tempdb..#tempTest') IS NOT NULL DROP TABLE #tempTest WITH rows AS ( SELECT *, ROW_NUMBER() OVER (ORDER BY [発生時刻]) AS rn FROM [PROC_MN].[dbo].[TBL_FINISH_STATUS] WHERE PO_NO='GV12762' AND 発生時刻 BETWEEN '2018/03/16' AND '2018/03/18' AND [加工内容]='Bonding' ) SELECT DATEDIFF(minute, mc.[発生時刻], mp.[発生時刻]) AS DiffMinutes INTO #tempTest FROM rows mc JOIN rows mp ON mc.rn = mp.rn - 1
关键说明
- 第一种方法适合需要严格控制临时表结构(比如添加约束、默认值)的场景;
- 第二种方法更快捷,适合快速生成临时表的场景;
- 两种方法都解决了你之前语句中“未定义临时表就插入”和“CTE与Insert语法错误”的问题。
内容的提问来源于stack exchange,提问作者Cát Tường Vy
相关产品推荐
相关产品推荐

