2012-02-18 4 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

Принимая во внимание, что это разумный и хороший совет, он не затрагивает непосредственные проблемы, с которыми сталкивается ОП. –