【问题标题】:SQL Server 2008 column prefix errorSQL Server 2008 列前缀错误
【发布时间】:2012-02-18 17:47:22
【问题描述】:

所以我可以正常工作:

CREATE FUNCTION dbo.GetLiveStream(@UserName NVARCHAR(MAX)) RETURNS TABLE
AS
  RETURN (
    SELECT DISTINCT l.* 
      FROM StreamView l
      JOIN Friendships f ON f.Sender = @UserName OR f.Recipient = @UserName 
     WHERE l.Sender <> @UserName 
       AND l.Recipient <> @UserName 
       AND (   l.Sender = f.Recipient 
            OR l.Sender = f.Sender 
            OR l.Recipient = f.Sender 
            OR l.Recipient = f.Recipient) 

  )
GO

但是当尝试执行以下查询时:

SELECT ROW_NUMBER() OVER(ORDER BY DateTime DESC) AS RowNumber, 
       * 
  FROM dbo.GetLiveStream('jason') 
  WHERE RowNumber >= 0
  AND RowNumber < 0+ 10; 

我收到以下错误:

消息 207,第 16 层,状态 1,第 4 行
列名“行号”无效。
消息 207,第 16 层,状态 1,第 5 行
列名“RowNumber”无效。

请注意,指定 l.* 会返回此错误:

消息 107,第 15 级,状态 1,第 2 行
列前缀“l”与查询中使用的表名或别名不匹配。

GetLiveStream 是一个函数:

RETURN (
    SELECT DISTINCT l.* 
      FROM StreamView l
      JOIN Friendships f ON f.Sender = @UserName OR f.Recipient = @UserName 
     WHERE l.Sender <> @UserName 
       AND l.Recipient <> @UserName 
       AND (   l.Sender = f.Recipient 
            OR l.Sender = f.Sender 
            OR l.Recipient = f.Sender 
            OR l.Recipient = f.Recipient) AND f.IsPending = 0

  )

如何解决?谢谢。

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    您不能在 WHERE 子句中引用别名。这样做:

    select *
    from
    (
        SELECT ROW_NUMBER() OVER(ORDER BY DateTime DESC) AS RowNumber, 
               * 
          FROM dbo.GetLiveStream('jason') 
    ) a
      WHERE RowNumber >= 0
      AND RowNumber < 0+ 10; 
    

    至于您的l.* 错误,这是因为该别名是函数及其查询定义的本地别名,无法在其外部引用。

    【讨论】:

      【解决方案2】:

      不要在存储过程或函数中使用*,因为它会被编译成列列表,随着时间的推移会发生变化,从而破坏已编译的代码。发生这种情况时,SQL Server 不会警告您。

      【讨论】:

      • 虽然这是一个谨慎的好建议,但它并不能解决 OP 面临的直接问题。
      猜你喜欢
      • 1970-01-01
      • 2014-09-07
      • 1970-01-01
      • 2015-05-13
      • 2011-09-13
      • 2015-05-28
      • 2014-12-25
      • 1970-01-01
      相关资源
      最近更新 更多