2016-06-29 2 views
1

So hat meine gespeicherte Prozedur eine Personalspalte, die einen Mitarbeitername aus meiner Employee Tabelle generieren sollte. Der Name des Personals wird nur für einige Zeilen angezeigt. Kann mir jemand einen Blick und sehen, wo mein Fehler ist hier:Staff-Spalte für meine gespeicherte Prozedur generiert nicht immer Informationen

BEGIN 
    IF EXISTS (SELECT 1 FROM [user] (NOLOCK) 
       WHERE [user].ID = @UserID 
       AND [user].BrandID IS NULL AND [user].SpaID IS NULL) 
BEGIN 
    DECLARE @OrderStatusID_Completed int, @OrderStatusID_Shipped int 

    SET @OrderStatusID_Shipped = 4 
    SET @OrderStatusID_Completed = 2 

    SELECT 
     CAST('' AS varchar(50)) AS ErrMsg 
     , o.OrderNumber 
     , Customer.GUID AS CustomerGUID 
     , OrderItem_View.DateCreated AS ItemDate 
     , COALESCE(MasterProductVariant.SKU, ProductVariant.SKU, Treatment.SKU) AS SKU 
     , DynamicPrice.FinalPrice AS Price 
     --, COALESCE(MasterProductVariant.OriginalPrice, ProductVariant.OriginalPrice, Treatment.Price) AS Price 
     , ISNULL(Employee.FirstName,'') + ' ' + ISNULL(Employee.LastName,'') AS Staff 
     , COALESCE(Product.Name, Treatment.Name) AS Item 
     , NULL AS Note 
    FROM 
     [Order] o (Nolock) 
    LEFT JOIN 
     Customer (Nolock) ON o.CustomerID = Customer.ID 
    INNER JOIN 
     OrderItem_View (nolock) ON OrderItem_View.OrderID = o.ID 
    LEFT JOIN 
     DynamicPrice (nolock) ON OrderItem_View.DynamicPriceID = DynamicPrice.ID 
    LEFT JOIN 
     AppointmentTreatment WITH (NOLOCK) ON AppointmentTreatment.ID = OrderItem_View.AppointmentTreatmentID 
    LEFT JOIN 
     Employee (NOLOCK) ON Employee.ID = COALESCE(OrderItem_View.EmployeeID, OrderItem_View.Employee2ID, AppointmentTreatment.EmployeeID) 
    LEFT JOIN 
     Treatment_View Treatment (nolock) ON Treatment.BillableItemID = OrderItem_View.BillableItemID 
    LEFT JOIN 
     ProductVariant (NOLOCK) 
    LEFT JOIN 
     Product (NOLOCK) ON Product.ID = ProductVariant.ProductID 
      ON ProductVariant.BillableItemID = OrderItem_View.BillableItemID 
    LEFT JOIN 
     ProductVariant MasterProductVariant (NOLOCK) ON ProductVariant.MasterRecordID = MasterProductVariant.ID 
    WHERE 
     o.SpaID = @SpaID 
     AND o.IsDeleted = 0 
     AND o.DateCompleted >= CONVERT(DATETIME,0) 
     AND o.DateCompleted < GetDate() 
     AND o.StatusID IN (@OrderStatusID_Completed,@OrderStatusID_Shipped) 
END 
ELSE 
    SELECT CAST('Insufficient rights.' AS VARCHAR(50)) AS ErrMsg 
END 
+1

vielleicht nicht verwandt, aber verstehst du, was Nolock bedeuten? – Fredou

+0

Set [Schlechte Angewohnheit, NOLOCK überall hinzuschieben] (http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/) - es ist * nicht empfehlenswert *, dies überall zu benutzen - im Gegenteil –

Antwort

2

Es ist in der coalesce Funktion sein muss. Irgendwo zwischen diesen drei - Sie keinen Wert

OrderItem_View.EmployeeID OrderItem_View.Employee2ID AppointmentTreatment.EmployeeID

So laufen OrderItem_View selbst bekommen und sehen, ob es Fälle, in denen EmployeeID oder Employee2ID immer null ist. Wenn ja, versuchen Sie herauszufinden, welche Mitarbeiter fehlen. Wenn Mitarbeiter fehlen, fehlen sie auch in der AppointmentTreatment-Tabelle? Wenn ja, dann liegt darin das Problem.