2013-06-20 2 views
0
CREATE PROCEDURE [dbo].[spReport] 
     @FromDate DATETIME = NULL, 
     @ToDate DATETIME = NULL, 
     @TenantID int , 
     @BusinessUnitId int 
AS 
BEGIN 
    Declare @listStr Varchar(max), @listValue Varchar(max) 

    Select 
    @listStr = COALESCE(@listStr+',' ,'') + FieldLabel 
    From 
    (Select Distinct Top 100 
     FieldLabel, ControlTypeId 
     From 
     PaymentCustomFieldDefinitions PCFD 
     Inner Join 
     Product P On P.Id = PCFD.ProductId 
     Where 
     P.TenantId = @TenantId 
     Order By 
     ControlTypeId Desc) R 

    Set @listStr = ',' + @listStr 
    Set @listStr = IsNull(@listStr, '') 

    Select  
     'Confirmation Number,Business Unit,Bank Account,Merchant Account,Product Name,Payment Date,Payment Time,Total Amount,Status,First Name,Last Name,Payment Method' + @listStr 
    Union 
    SELECT  
     p.ConfirmationNumber + ',' + bu.Name + ',' + p.TenantBankAccountName + ',' + Case When ma.Name IS NULL then '' ELSE ma.Name END + ',' + pd.Name + ',' + 
     cast(P.PaymentDate as Varchar(11)) + ',' + convert(VARCHAR(8), P.PaymentDate,108) + ',' + Cast(p.TotalDue As Varchar(20)) + ',' + p.PaymentStatusText + ',' + p.PayorFirstName + ',' + p.PayorLastName + ',' + p.PaymentMethodText + ',' + [dbo].[GetPaymentReferenceAndCustomFields](p.Id,@listStr) 
    FROM 
     Payment p 
    INNER JOIN 
     Product pd ON p.ProductId = pd.Id 
    INNER JOIN 
     BusinessUnit bu ON pd.BusinessUnitId = bu.Id 
    INNER JOIN 
     ProductDetailPayment pdp ON p.ProductId = pdp.ProductId 
    LEFT OUTER JOIN 
     MerchantAccount ma ON ma.Id = pdp.MerchantAccountId 
    WHERE 
     p.PaymentDate BETWEEN @FromDate AND @ToDate 
     AND p.TenantId = @TenantId AND pd.BusinessUnitId= @BusinessUnitId 
    ORDER BY 
     p.ProductId desc 
END 

Getting эту ошибку при использовании Order by:Заказывайте с Union Sql Server 2008

Msg 4104, Level 16, State 1, процедура spReport, Линия 41
Мульти-часть идентификатор «р. ProductId "не может быть связан.
Msg 104, уровень 16, состояние 1, процедура spQueryPaymentDetailReport, строка 41
Элементы ORDER BY должны отображаться в списке выбора, если оператор содержит оператор UNION, INTERSECT или EXCEPT.

ответ

1

Вы не можете ссылаться на p.ProductId в ORDER BY, поскольку первый подзапрос не имеет p набор данных.

Вы не можете ссылаться на столбец ProductId в ORDER BY, потому что в объединенном наборе результатов нет столбца этого имени.

Для решения этих проблем можно добавить ProductId колонки и, если конечный вывод должен содержать один столбец, как в запросе, использовать производную таблицу:

SELECT p.CSV FROM ( 
    Select 
     ProductId = 2147483647, 
     CSV = 'Confirmation Number,Business Unit,Bank Account,Merchant Account,Product Name,Payment Date,Payment Time,Total Amount,Status,First Name,Last Name,Payment Method' + @listStr 
    Union 
    SELECT 
     p.ProductId, 
     p.ConfirmationNumber + ',' + bu.Name + ',' + p.TenantBankAccountName + ',' + Case When ma.Name IS NULL then '' ELSE ma.Name END + ',' + pd.Name + ',' + 
     cast(P.PaymentDate as Varchar(11)) + ',' + convert(VARCHAR(8), P.PaymentDate,108) + ',' + Cast(p.TotalDue As Varchar(20)) + ',' + p.PaymentStatusText + ',' + p.PayorFirstName + ',' + p.PayorLastName + ',' + p.PaymentMethodText + ',' + [dbo].[GetPaymentReferenceAndCustomFields](p.Id,@listStr) 
    FROM 
     Payment p 
    INNER JOIN 
     Product pd ON p.ProductId = pd.Id 
    INNER JOIN 
     BusinessUnit bu ON pd.BusinessUnitId = bu.Id 
    INNER JOIN 
     ProductDetailPayment pdp ON p.ProductId = pdp.ProductId 
    LEFT OUTER JOIN 
     MerchantAccount ma ON ma.Id = pdp.MerchantAccountId 
    WHERE 
     p.PaymentDate BETWEEN @FromDate AND @ToDate 
     AND p.TenantId = @TenantId AND pd.BusinessUnitId= @BusinessUnitId 
) p 
ORDER BY 
    p.ProductId desc 
;

Первая строка назначена MaxInt ID, потому что, как я понимаю, это строка заголовка и должна идти первым в соответствии с указанным пунктом ORDER BY p.ProductId DESC (и потому, что я предположил, что ProductId - это int, конечно).

+0

Спасибо @ Andriy M, это решило мою проблему с совершенством. –