【问题标题】:Cant define SQL variable when using WITH statement使用 WITH 语句时无法定义 SQL 变量
【发布时间】:2013-10-09 12:07:36
【问题描述】:

此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)

为什么?

【问题讨论】:

  • 公用表表达式(WITH)只对一个命令(next)有效。您不能在 WITH A (...) 声明和 SELECT * FROM A 之间声明变量或做任何事情

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


【解决方案1】:

做事

DECLARE @dt DATETIME;

SET @dt = GETDATE();

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

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

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

【讨论】:

  • 不,我想设置A计算后的时间
  • @Yosi - 所以将它移动到 SELECT 之后和 PRINT 之前。
  • @MartinSmith - 谢谢,我想知道评估 A 需要多少时间,你的建议并不能解决这个问题。但我得到了原始问题的答案:)
  • @Yosi - 您的用例似乎是基于对 CTE 实际工作方式的基本误解。它们只是内联到以下查询中。它们没有预先实现和评估。
  • @MartinSmith - 收回我的反对票,你能编辑一下吗?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:
    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 以正确计算。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-19
      • 2019-07-31
      • 2020-08-02
      • 2019-04-27
      • 1970-01-01
      • 1970-01-01
      • 2016-05-07
      相关资源
      最近更新 更多