2016-09-08 4 views
0

Я создаю эту функцию для вычисления Количества От недостатка материалаВремя ожидания истекло время ожидания истекло SQL Server 2012

ALTER FUNCTION [dbo].[ReturnShortageByItemCodeLinePackage] 
    (@lineId int, @testpackId int, @MaterialDescriptionId int) 
RETURNS float 
AS BEGIN 
    DECLARE @shortageQuantity float 
    DECLARE @MIVQuantity float 
    DECLARE @totalQuantity float 
    DECLARE @spoolQuantity float 
    DECLARE @ExistInSiteQuantity float 
    DECLARE @BeforeDoneQuantity float 

    SELECT 
     @totalQuantity = Quantity, 
     @spoolQuantity = QuantitySpool, 
     @ExistInSiteQuantity = QuantityExistInSite, 
     @BeforeDoneQuantity = QuantityBeforeDone 
    FROM 
     [SPMS2].[dbo].Materials 
    WHERE 
     LineId = @lineId 
     AND TestPackageId = @testpackId 
     AND MaterialDescriptionId = @MaterialDescriptionId 

    SELECT 
     @MIVQuantity = SUM(QuantityDeliver) 
    FROM 
     MaterialIssueVoucherDetails miv 
    JOIN 
     MaterialRequestContractorDetails mrc ON miv.MaterialRequestContractorDetailId = mrc.Id 
    WHERE 
     TestPackageId = @testpackId 
     AND LineId = @lineId 
     AND miv.MaterialDescriptionId = @MaterialDescriptionId 

    IF @MIVQuantity IS NULL 
    BEGIN 
     SET @MIVQuantity = 0  
    END 

    SET @shortageQuantity = @totalQuantity - (@BeforeDoneQuantity + @ExistInSiteQuantity + @spoolQuantity + @MIVQuantity) 

    RETURN round(@shortageQuantity,3) 
END 

Я использую эту функцию в моей хранимой процедуре, как вы можете увидеть здесь:

ALTER PROCEDURE [dbo].[SPViewMTO] 
AS 
BEGIN 
    SELECT   
     dbo.Lines.Unit, dbo.Lines.LineNumber, dbo.Lines.DocumentNumber, 
     dbo.BaseMaterials.Name AS MaterialName, 
     dbo.MaterialDescriptions.Name AS MaterialDescription, 
     dbo.MaterialDescriptions.Description, dbo.MaterialScopes.ScopeName, 
     dbo.MaterialScopeObjectNames.ObjectName, 
     dbo.MaterialDescriptions.Size1, dbo.MaterialDescriptions.Size2, 
     dbo.MaterialDescriptions.ItemCode, 
     dbo.Materials.Quantity, dbo.Materials.Discipline, dbo.Materials.Id, 
     dbo.Lines.Id AS LineId, dbo.Materials.QuantitySpool, 
     dbo.Materials.QuantityExistInSite, dbo.Materials.QuantityBeforeDone, 
     dbo.TestPackages.PackageNumber, dbo.Materials.TestPackageId, 
     ISNULL(dbo.ReturnShortageByItemCodeLinePackage(Lines.Id, TestPackageId, MaterialDescriptionId), 0) AS Shortage 
    FROM    
     dbo.Materials 
    INNER JOIN 
     dbo.Lines ON dbo.Materials.LineId = dbo.Lines.Id 
    INNER JOIN 
     dbo.BaseMaterials ON dbo.Lines.BaseMaterialId = dbo.BaseMaterials.Id 
    INNER JOIN 
     dbo.MaterialDescriptions ON dbo.Materials.MaterialDescriptionId = dbo.MaterialDescriptions.Id 
    INNER JOIN 
     dbo.MaterialScopes ON dbo.MaterialDescriptions.MaterialScopeId = dbo.MaterialScopes.Id 
    INNER JOIN 
     dbo.MaterialScopeObjectNames ON dbo.MaterialDescriptions.MaterialScopeObjectId = dbo.MaterialScopeObjectNames.Id 
    INNER JOIN 
     dbo.TestPackages ON dbo.Materials.TestPackageId = dbo.TestPackages.Id 
END 

временное выполнение хранимой процедуры составляет около 47 секунд внутри моей SQL Server Management Studio напрямую, но когда я вызываю хранимую процедуру «из моего приложения C#, я получаю эту ошибку:

timeout expired the timeout period elapsed SQL Server 2012

Вот мой код для вызова хранимой процедуры:

lst = _ctx.Database.SqlQuery<ViewDomainClass.MaterialOffice.DAViewMTO> 
         ("EXEC [dbo].SPViewMTO").ToList(); 
+1

Попробуйте изменить свойство CommandTimeout. См. Http://stackoverflow.com/questions/6232633/entity-framework-timeouts. Если это поможет, я отправлю его в качестве ответа. – Anton

+0

@ Антон спасибо, я просто удаляю свойство timeout в строке подключения и добавляю его в такой контекст: this.context.Database.CommandTimeout = 180; –

ответ

0

таймаута является свойством строки подключения в ADO.NET и других рамочных, как LINQ & EF. Попробуйте изменить таймаут в строке подключения, как вы хотите. Также вы можете установить время на SQLCommand для переопределения свойства тайм-аута.

0

Вы используете (NOLOCK), вы можете увеличить производительность своего запроса.

ALTER PROCEDURE [dbo].[SPViewMTO] 
AS 
BEGIN 


SELECT  dbo.Lines.Unit, dbo.Lines.LineNumber, dbo.Lines.DocumentNumber, dbo.BaseMaterials.Name AS MaterialName, 
          dbo.MaterialDescriptions.Name AS MaterialDescription, dbo.MaterialDescriptions.Description, dbo.MaterialScopes.ScopeName, 
          dbo.MaterialScopeObjectNames.ObjectName, dbo.MaterialDescriptions.Size1, dbo.MaterialDescriptions.Size2, dbo.MaterialDescriptions.ItemCode, 
          dbo.Materials.Quantity, dbo.Materials.Discipline, dbo.Materials.Id, dbo.Lines.Id AS LineId, dbo.Materials.QuantitySpool, dbo.Materials.QuantityExistInSite, 
          dbo.Materials.QuantityBeforeDone, dbo.TestPackages.PackageNumber, dbo.Materials.TestPackageId,isnull(dbo.ReturnShortageByItemCodeLinePackage(Lines.Id,TestPackageId,MaterialDescriptionId),0) As Shortage 
    FROM   dbo.Materials(NOLOCK) INNER JOIN 
          dbo.Lines(NOLOCK) ON dbo.Materials.LineId = dbo.Lines.Id INNER JOIN 
          dbo.BaseMaterials(NOLOCK) ON dbo.Lines.BaseMaterialId = dbo.BaseMaterials.Id INNER JOIN 
          dbo.MaterialDescriptions(NOLOCK) ON dbo.Materials.MaterialDescriptionId = dbo.MaterialDescriptions.Id INNER JOIN 
          dbo.MaterialScopes(NOLOCK) ON dbo.MaterialDescriptions.MaterialScopeId = dbo.MaterialScopes.Id INNER JOIN 
          dbo.MaterialScopeObjectNames(NOLOCK) ON dbo.MaterialDescriptions.MaterialScopeObjectId = dbo.MaterialScopeObjectNames.Id INNER JOIN 
          dbo.TestPackages(NOLOCK) ON dbo.Materials.TestPackageId = dbo.TestPackages.Id 

    EnD 
+0

Фактически производительность остается прежней –

Смежные вопросы