Sql server 是否可以在CTE中使用临时表?

Sql server 是否可以在CTE中使用临时表?,sql-server,sql-server-2000,common-table-expression,Sql Server,Sql Server 2000,Common Table Expression,我对下面的查询有问题。我使用行号为SQLServer2005编写了这个查询,但是我意识到SQLServer2000,所以我不能使用行号。我删除了带有标识和临时表的行号,但查询不起作用。有什么解决办法吗?如果是解决方案,使用cte和temp表是个好主意 @Emp nvarchar(50), @Start_Date nvarchar(50), @End_Date nvarchar(50) as WITH Ordered AS (SELECT CONVERT(VARCHAR(15), cas

我对下面的查询有问题。我使用行号为SQLServer2005编写了这个查询,但是我意识到SQLServer2000,所以我不能使用行号。我删除了带有标识和临时表的行号,但查询不起作用。有什么解决办法吗?如果是解决方案,使用cte和temp表是个好主意

@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' 

查询的语法不正确。不能在CTE查询中创建和删除临时表

顺便说一句,鉴于您需要的所有信息都在临时表中,所以本案例不需要CTE。您可以按如下方式重写查询:

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;

在查询的中间有一个滴表临时。这没有意义。我用drop来删除临时表。如果我不使用drop并执行两次查询,那么数据库中已经有一个名为“TEMP”的对象。错误我无法使此查询正常运行。。。知道哪里不对吗?如果我执行已发布的查询,我会发现下一个错误消息156,级别15,状态1,过程Ipo_1,第20行关键字“IDENTITY”附近的语法不正确。Msg 102,级别15,状态1,Ipo_1,第26行附近的语法不正确。SQL Server 2000没有CTE。但是如果你在CTE中尝试做的事情是完全无效的。是的,你对CTE的看法是正确的,使用CTE是没有意义的。有时候做一个初学者很累:谢谢