2012-02-18 85 views
3

所以我有这样的工作是否正常:SQL Server 2008的列前缀错误

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; 

我收到以下错误:

Msg 207, Level 16, State 1, Line 4
Invalid column name 'RowNumber'.
Msg 207, Level 16, State 1, Line 5
Invalid column name 'RowNumber'.

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

Msg 107, Level 15, State 1, Line 2
The column prefix 'l' does not match with a table name or alias name used in the query.

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 

) 

这又如何解决?谢谢。

回答

4

您不能在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.*的错误,这是因为该别名是本地的功能和它的查询定义,不能在其外部引用。

-1

请勿在存储过程或函数中使用*,因为它会被编译为一列列,这些列可能随时间而改变,从而中断编译后的代码。发生这种情况时,SQL Server不会发出警告。

+3

尽管这是一个谨慎而好的建议,但它并没有解决OP所面临的直接问题。 – 2012-02-18 05:03:16