[英]Could not insert into temp table from WITH ROWS AS clause in SQL Server
I want to insert a result that return by this query: 我想插入由该查询返回的结果:
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.[発生時刻])
FROM rows mc
JOIN rows mp
ON mc.rn = mp.rn - 1
The resut is : 91 结果是:91
I use this query but cannot, please help! 我使用此查询,但不能,请帮忙!
IF OBJECT_ID('tempdb..#tempTest') IS NOT NULL
DROP TABLE #tempTest
Insert into #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.[発生時刻])
FROM rows mc
JOIN rows mp
ON mc.rn = mp.rn - 1
EDITED: This one work for me 编辑:这为我工作
If(OBJECT_ID('tempdb..#temp') Is Not Null)
Begin
Drop Table #Temp
End
create table #Temp
(
OptTime int
)
;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 #Temp
SELECT DATEDIFF(minute, mc.[発生時刻], mp.[発生時刻])
FROM rows mc
JOIN rows mp
ON mc.rn = mp.rn - 1
Your syntax is wrong - if you want to insert from a CTE, do this: 您的语法错误-如果您要从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
SELECT (list of columns)
FROM rows
WHERE (conditions)
See the official Microsoft Docs for details on the CTE syntax and how to use it 有关CTE语法及其使用方法的详细信息,请参阅正式的Microsoft文档 。
Update: if that target temp table doesn't exist yet - use this syntax: 更新:如果该目标临时表尚不存在,请使用以下语法:
; WITH rows AS
( ..... )
SELECT (list of columns)
INSERT INTO #tempTest
FROM rows
WHERE (conditions)
Not only is the syntax wrong, but the logic is not very good either. 不仅语法错误,而且逻辑也不是很好。 Just use
lag()
: 只需使用
lag()
:
INSERT INTO #tempTest
SELECT DATEDIFF(minute, LAG(fs.[発生時刻]) OVER (ORDER BY [発生時刻]), fs.[発生時刻])
FROM [PROC_MN].[dbo].[TBL_FINISH_STATUS] fs
WHERE PO_NO = 'GV12762' AND
発生時刻 >= '2018-03-16' AND
発生時刻 < '2018-03-18' AND
[加工内容] = 'Bonding';
Notes: 笔记:
BETWEEN
with dates, particularly if they have times. BETWEEN
与日期一起使用,尤其是当它们有时间时。 You can refer to this very helpful blog post by Aaron Bertrand. NULL
s you can use a subquery or CTE. NULL
,则可以使用子查询或CTE。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.