2015-03-27 3 views
0

Я пытаюсь изменить существующий вид с новым кодом:Запрос в виде не может быть сохранен

with cte1 as (
SELECT dbo.T_ActionTicketLog.ID, dbo.T_ActionTicketLog.ActionTicketID, dbo.T_Action.Artist, dbo.T_ActionTickets.ActionDate, dbo.T_ActionSeatsType.SeatType, 
     dbo.T_ActionPlaceSeats.Seats, dbo.T_ActionTickets.RowNumber, dbo.T_ActionTickets.SeatNumber, dbo.T_ActionTickets.Price, dbo.T_TicketStatus.Name AS Status, 
     dbo.T_Users.UserName, dbo.T_OrderTicket.OrderID, T_Users_1.UserName AS SalerName, dbo.T_Fiscal.DocNum, dbo.T_FiscalType.Name AS DocType, 
     dbo.T_ActionTicketLog.TicketOrderID, dbo.T_ActionTicketLog.StatusID, dbo.T_ActionTicketLog.UserID, dbo.T_ActionTicketLog.SalerID, dbo.T_ActionTicketLog.FiscalID, 
     dbo.T_ActionTicketLog.BarCode, dbo.T_ActionTicketLog.ReservDate, dbo.T_ActionTicketLog.Created, dbo.T_ActionTicketLog.Comments, 
     CASE WHEN StatusID IN (3, 10) THEN 1 ELSE 0 END 
     * ROW_NUMBER() OVER (PARTITION BY T_ActionTicketLog.ActionTicketID, T_ActionTicketLog.StatusID ORDER BY T_ActionTicketLog.Created) AS rn 
FROM   dbo.T_Users AS T_Users_1 RIGHT OUTER JOIN 
     dbo.T_ActionPlaceSeats INNER JOIN 
     dbo.T_ActionTicketLog INNER JOIN 
     dbo.T_TicketStatus ON dbo.T_ActionTicketLog.StatusID = dbo.T_TicketStatus.ID INNER JOIN 
     dbo.T_Action INNER JOIN 
     dbo.T_ActionTickets ON dbo.T_Action.ID = dbo.T_ActionTickets.ActionID INNER JOIN 
     dbo.T_ActionSeatsSubType ON dbo.T_ActionTickets.ActionSeatsSubTypeID = dbo.T_ActionSeatsSubType.ID ON 
     dbo.T_ActionTicketLog.ActionTicketID = dbo.T_ActionTickets.ID INNER JOIN 
     dbo.T_ActionSeatsType ON dbo.T_ActionSeatsSubType.SeatsTypeID = dbo.T_ActionSeatsType.ID ON 
     dbo.T_ActionPlaceSeats.ID = dbo.T_ActionSeatsType.SeatsID LEFT OUTER JOIN 
     dbo.T_Users ON dbo.T_ActionTicketLog.UserID = dbo.T_Users.ID ON T_Users_1.ID = dbo.T_ActionTicketLog.SalerID LEFT OUTER JOIN 
     dbo.T_FiscalType INNER JOIN 
     dbo.T_Fiscal ON dbo.T_FiscalType.ID = dbo.T_Fiscal.FiscalTypeID ON dbo.T_ActionTicketLog.FiscalID = dbo.T_Fiscal.ID LEFT OUTER JOIN 
     dbo.T_OrderTicket ON dbo.T_ActionTicketLog.TicketOrderID = dbo.T_OrderTicket.ID 
), 
cte2 as (
    SELECT ActionTicketID, OrderTicketID, Created, TicketBarCode, 
    ROW_NUMBER() OVER (PARTITION BY ActionTicketID ORDER BY Created) AS rn 
    FROM T_TicketPrint 
) 
SELECT cte1.*, oa.TicketBarCode 
FROM cte1 
OUTER APPLY (
    SELECT * FROM cte2 
    WHERE cte1.ActionTicketID = cte2.ActionTicketID AND cte1.TicketOrderID = cte2.OrderTicketID AND cte1.rn = cte2.rn 
) oa 
order by dbo.func_ConvertToInt(cte1.SeatNumber), cte1.ActionTicketID, cte1.Created 

Когда я пытаюсь сохранить его, эта ошибка возникает: «Поручения пункта является недействительными в представлениях, встроенных функциях, производных таблицах, подзапросах и общих табличных выражениях, если также не указаны TOP, OFFSET или FOR XML. "

Что случилось с запросом?

+0

Я замечаю у вас есть ',' в самом начале, что намеренно? – maam27

+0

Попробуйте избавиться от начальной точки с запятой. – SouravA

+0

Было намеренно. Но, когда я удаляю его, ошибка все еще существует. – tesicg

ответ

0

Да, вы не можете обычно имеют order by в виде или в подзапросе. Если вам действительно нужен упорядоченный вывод, попробуйте использовать ручку SELECT TOP 100 PERCENT.

Положите его в окончательном select

. 
. 
. 
SELECT TOP 100 PERCENT cte1.*, oa.TicketBarCode 
FROM cte1 
OUTER APPLY (
    SELECT * FROM cte2 
    WHERE cte1.ActionTicketID = cte2.ActionTicketID AND cte1.TicketOrderID = cte2.OrderTicketID AND cte1.rn = cte2.rn 
) oa 
order by dbo.func_ConvertToInt(cte1.SeatNumber), cte1.ActionTicketID, cte1.Created 
+0

Я уже пробовал это. Это не помогает. – tesicg

1

ORDER BY положение с точки зрения не имеет смысла сама по себе. Строки в представлении не имеют никакого порядка таким же образом, поскольку строки в таблице не имеют никакого порядка.

Таким образом, вы можете либо удалить статью ORDER BY с точки зрения вообще, или оставить ORDER BY и добавить TOP (100) PERCENT к статье SELECT. Как правило, нет смысла иметь TOP (100) PERCENT и ORDER BY, потому что это просто замедляет запрос. ORDER BY в представлении имеет смысл, когда TOP ограничивает количество строк каким-то образом.

Я хочу прояснить ситуацию. Это распространенное недоразумение. Если определить вид как:

CREATE VIEW SomeView 
AS 
SELECT TOP(100) PERCENT SomeColumn 
FROM SomeTable 
ORDER BY SomeColumn 

И затем SELECT с этой точки зрения без ORDER BY:

SELECT SomeColumn 
FROM SomeView 

Тогда порядок строк, возвращаемых в результате этого SELECT не определен и может быть любым. Иногда его можно заказать по номеру SomeColumn, иногда нет. Это зависит от многих вещей. Только если добавить ORDER BY к заключительному SELECT вы получите гарантированный заказ:

SELECT SomeColumn 
FROM SomeView 
ORDER BY SomeColumn 
+0

Я уже пытался использовать TOP (100) PERCENT, но все равно не могу его сохранить. Что относительно предложения ORDER BY в функции ROW_NUMBER? – tesicg

+0

'ROW_NUMBER()' 'требуется' ORDER BY' в предложении 'OVER'. Я не понимаю, почему с 'TOP' вы все еще не можете сохранить представление. В любом случае, как я объяснил в ответе «TOP (100) PERCENT', в представлении не имеет смысла, поэтому вам действительно нужно удалить« order by dbo.func_ConvertToInt (cte1.SeatNumber), cte1.ActionTicketID, cte1.Created'. Если вы удалите его из определения представления, можете ли вы его сохранить? –

+0

Я заработал. Проблема была в мастере MS SQL Server Management Studio.Когда вы пишете просмотр вручную, eveything работает нормально. Пожалуйста, просмотрите эту тему в качестве ссылки: http://stackoverflow.com/questions/13280520/row-number-in-a-view-in-sql-server-2005 – tesicg