【问题标题】:Invalid column name SQL Server 2012无效的列名 SQL Server 2012
【发布时间】:2013-03-01 09:54:37
【问题描述】:

如何在WHERE 子句中使用名称Rowss

SELECT TOP 10 
    ROW_NUMBER() OVER(ORDER BY dp.IdPytanie) AS Rowss,
    dp.IdPytanie
    ,dp.SpecjalnePytanie
 FROM dodajtemat_pytanie dp
 WHERE 
    (@RowBegining = 0 OR convert(int,Rowss) >= @RowBegining)
    AND (@RowEnd = 0 OR Rowss <= @RowEnd)

错误

这个作品->

 @RowEnd = 0 OR ROW_NUMBER() OVER(ORDER BY dp.IdPytanie) <= @RowEnd

【问题讨论】:

  • 您不能在 WHERE 子句中引用为同一查询的列提供的别名,您需要使用子查询,或将 Rowss 替换为其完整表达式。
  • 2012 年你可能想看看OFFSET ... FETCH

标签: sql sql-server tsql sql-server-2012


【解决方案1】:

像这样使用子查询或 CTE

WITH CTE
AS
(
    SELECT 
      ROW_NUMBER() OVER(ORDER BY dp.IdPytanie) AS Rowss,
      dp.IdPytanie,
      dp.SpecjalnePytanie
    FROM dodajtemat_pytanie dp
)
SELECT *
FROM CTE
WHERE (@RowBegining = 0 OR Rowss >= @RowBegining)
  AND (@RowEnd      = 0 OR Rowss <= @RowEnd);

WHERE 子句在SELECT 语句之前进行逻辑评估,因此它无法识别新创建的别名Rowss

有关 SQL Server 中逻辑查询处理步骤的详细信息,请参阅:

【讨论】:

  • 但是优化会损失很多
  • 因为我接受了所有论点,后来我只接受我想要的这个。接受所有参数是错误的,因为过程会更慢。当然你的回答是正确的,我会接受的。感谢您的帮助和您的时间。
  • 你为什么要进行转换? convert(int, Rowss)
  • @Mahmoud Gamal 好的,我会测试一下。
  • @Rafael-JuniorMVCDeveloper 为什么您认为 CTE 的优化方式与您最初编写的查询不同(如果那是合法的语法)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多