2016-06-29 2 views
1

私のストアドプロシージャには私のEmployeeテーブルからスタッフ名を生成するスタッフ列があります。スタッフ名は、一部の行についてのみ表示されます。誰も見て、私のエラーがここにどこにあるか見ることができます:私のストアドプロシージャのスタッフの列は、常に情報を生成するとは限りません

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

多分関係はありませんが、あなたはノーロックの意味を理解していますか? – Fredou

+0

[どこにでもNOLOCKを置くための嫌な習慣](http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/) - これはどこでも使用することをお勧めしません*全く反対です –

答えて

2

それは合体機能にする必要があります。どこか3これらの間に - あなたは

OrderItem_View.EmployeeID OrderItem_View.Employee2ID AppointmentTreatment.EmployeeID

だから、それ自体でOrderItem_View実行し、社員やEmployee2IDが今までヌルであるインスタンスがあるかどうかを確認値を取得されていません。そうであれば、欠落している従業員を判断してください。不足している従業員がいる場合、予定表にも不足していますか?もしそうなら、そこに問題がある。

関連する問題