簡體   English   中英

無法從SQL Server中的WITH ROWS AS子句插入到臨時表中

[英]Could not insert into temp table from WITH ROWS AS clause in SQL Server

我想插入由該查詢返回的結果:

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 

結果是:91

我使用此查詢,但不能,請幫忙!

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 

編輯:這為我工作

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 

您的語法錯誤-如果您要從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)

有關CTE語法及其使用方法的詳細信息,請參閱正式的Microsoft文檔

更新:如果該目標臨時表尚不存在,請使用以下語法:

; WITH rows AS 
(  .....    ) 
SELECT (list of columns)
INSERT INTO #tempTest
FROM rows
WHERE (conditions)

不僅語法錯誤,而且邏輯也不是很好。 只需使用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';

筆記:

  • 對日期使用ISO / ANSI標准語法。 那是連字符而不是斜線。
  • 不要將BETWEEN與日期一起使用,尤其是當它們有時間時。 您可以參考Aaron Bertrand的這篇非常有用的博客文章。
  • 如果使用適當的SQL功能,則查詢將更簡單。
  • 如果要排除NULL ,則可以使用子查詢或CTE。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM