使用WITH语句时无法定义SQL变量

时间:2013-10-09 12:07:36

标签: sql sql-server sql-server-2008 common-table-expression

这个sql有效:

 WITH A AS
 (SELECT TOP 1000 * 
  FROM dbo.SomeTable)

 SELECT * FROM A

虽然这个错误(关键字'DECLARE'附近的语法不正确):

WITH A AS
(SELECT TOP 1000 * 
 FROM dbo.SomeTable)

 DECLARE @dt DATETIME 

 SET @dt = GETDATE()
 SELECT * FROM A

 PRINT DATEDIFF(SS,GETDATE(),@dt)

为什么?

3 个答案:

答案 0 :(得分:8)

只做

DECLARE @dt DATETIME;

SET @dt = GETDATE();

WITH A
     AS (SELECT TOP 1000 *
         FROM   dbo.SomeTable)
SELECT *
FROM   A;

PRINT DATEDIFF(SS, GETDATE(), @dt);

CTE定义后唯一有效的是使用它的单个语句

答案 1 :(得分:2)

CTE必须后跟一个引用部分或全部CTE列的SELECT,INSERT,UPDATE或DELETE语句。 CTE也可以在CREATE VIEW语句中指定,作为视图的定义SELECT语句的一部分。

http://msdn.microsoft.com/en-us/library/ms175972.aspx

答案 2 :(得分:0)

DECLARE @dt DATETIME 

SET @dt = GETDATE()

WITH A AS
(SELECT TOP 1000 * 
FROM dbo.SomeTable)

SELECT * FROM A

PRINT DATEDIFF(SS,@dt,GETDATE())

这对我来说很好,交换@dt和GETDATE()的位置以获得秒的正变化。 在选择之前设置@dt以正确计算。