Ошибка префикса столбца SQL Server 2008 - PullRequest
3 голосов
/ 18 февраля 2012

Так что у меня это работает правильно:

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
Неверное имя столбца 'RowNumber'.
Сообщение 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

  )

Как это можно решить? Спасибо.

Ответы [ 2 ]

4 голосов
/ 18 февраля 2012

Нельзя ссылаться на псевдоним в предложении 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.*, то это потому, что псевдоним является локальным для функции и ее определения запроса и на которую нельзя ссылаться за ее пределами.

0 голосов
/ 18 февраля 2012

Не используйте * в хранимой процедуре или функции, потому что она компилируется в список столбцов, которые могут со временем меняться и, таким образом, нарушать скомпилированный код.SQL Server не предупреждает вас, когда это происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...