2014-01-22 62 views
1

我在下面的查詢中遇到問題。我使用行號爲sql server 2005編寫這個查詢,但是我意識到sql server是2000,所以我不能使用行號。我刪除帶有標識和臨時表的行號,但查詢不起作用。有沒有解決方法?如果是解決方案,使用cte和temp表是一個好主意?可以在CTE中使用臨時表嗎?

@Emp nvarchar(50), 
@Start_Date nvarchar(50), 
@End_Date nvarchar(50) 
as 
WITH Ordered 
    AS (SELECT CONVERT(VARCHAR(15), cast(Substring(unitts, 1, 8) AS DATE), 105) AS Data, 
       Substring(UnitTS, 9, 2) + ':' + Substring(UnitTS, 11, 2)   AS EventTime, 
       CASE 
        WHEN RdrHead = 'A' THEN 'OUT' 
        ELSE 'IN ' 
       END                AS Reader, 
       [RdrName], 
       [CrdName], 
       IDENTITY (int, 1, 1)            AS rn, 
       UnitTS 
     INTO #TEMP --rn = row_number() over (order by Crdname,UnitTs) 
     FROM TandA.dbo.History 
     WHERE (UnitNr = '3' 
        AND RdrNr IN ('0', '2', '3') 
        OR UnitNr = '4' 
         AND RdrNr IN('1', '6')) 
       AND Type = 'A' 
       AND Sign = '+' 
       AND Substring(unitts, 1, 8) >= @Start_Date 
       AND Substring(unitts, 1, 8) <= @End_Date 
       AND (CrdName IN (@mp) 
         OR @emp = 'all') 

         SELECT * 
         FROM #TEMP 
         ORDER BY rn 

         DROP TABLE #TEMP) 
SELECT o_out.CrdName, 
     o_out.RdrName, 
     o_out.Data, 
     CASE 
     WHEN o_in.EventTime IS NULL THEN 'Necunoscut' 
     ELSE o_in.EventTime 
     END In_Time, 
     [Out_Time] = o_out.EventTime, 
     CASE 
     WHEN cast(datediff (s, o_in.EventTime, o_out.EventTime) AS INT) IS NULL THEN '0' 
     ELSE cast(datediff (S, o_in.EventTime, o_out.EventTime) AS INT) 
     END Duration 
FROM Ordered o_out 
     LEFT JOIN Ordered o_in 
     ON o_in.rn = o_out.rn - 1 
      AND o_in.Reader = 'in' 
WHERE o_out.Reader = 'out' 
+0

yes有可能 –

+1

在查詢中間有一個「DROP TABLE#TEMP」。這沒有意義。 – wdosanjos

+0

我使用drop來刪除臨時表。如果我不使用drop並且執行查詢兩次我已經有一個名爲'#TEMP'的對象在數據庫中。錯誤 – user3191790

回答

2

查詢的語法不正確。您無法在CTE查詢中創建並刪除#TEMP表。

順便說一下,這種情況下不需要CTE,因爲你需要的所有信息都在#TEMP表上。您可以按如下方式重寫查詢:

SELECT CONVERT(VARCHAR(15), cast(Substring(unitts, 1, 8) AS DATE), 105) AS Data, 
       Substring(UnitTS, 9, 2) + ':' + Substring(UnitTS, 11, 2)   AS EventTime, 
       CASE 
        WHEN RdrHead = 'A' THEN 'OUT' 
        ELSE 'IN ' 
       END                AS Reader, 
       [RdrName], 
       [CrdName], 
       IDENTITY (int, 1, 1)            AS rn, 
       UnitTS 
     INTO #TEMP --rn = row_number() over (order by Crdname,UnitTs) 
     FROM TandA.dbo.History 
     WHERE (UnitNr = '3' 
        AND RdrNr IN ('0', '2', '3') 
        OR UnitNr = '4' 
         AND RdrNr IN('1', '6')) 
       AND Type = 'A' 
       AND Sign = '+' 
       AND Substring(unitts, 1, 8) >= @Start_Date 
       AND Substring(unitts, 1, 8) <= @End_Date 
       AND (CrdName IN (@mp) 
         OR @emp = 'all') 

         ORDER BY rn; 

SELECT o_out.CrdName, 
     o_out.RdrName, 
     o_out.Data, 
     CASE 
     WHEN o_in.EventTime IS NULL THEN 'Necunoscut' 
     ELSE o_in.EventTime 
     END In_Time, 
     [Out_Time] = o_out.EventTime, 
     CASE 
     WHEN cast(datediff (s, o_in.EventTime, o_out.EventTime) AS INT) IS NULL THEN '0' 
     ELSE cast(datediff (S, o_in.EventTime, o_out.EventTime) AS INT) 
     END Duration 
FROM Ordered o_out 
     LEFT JOIN #TEMP o_in 
     ON o_in.rn = o_out.rn - 1 
      AND o_in.Reader = 'in' 
WHERE o_out.Reader = 'out'; 

DROP TABLE #TEMP; 
+0

是的,你對cte是正確的,它使用cte沒有任何意義。有時,作爲一個初學者很費力:)謝謝 – user3191790

相關問題