WITH Invent AS
(
SELECT i.ItemId, d.ConfigId
, CAST(SUM(t.Qty) AS FLOAT) Qty
FROM AX4.dbo.InventTable i
INNER JOIN AX4.dbo.InventTrans t
ON t.ItemId = i.ItemId
AND t.DataAreaId = i.DataAreaId
LEFT JOIN AX4.dbo.InventDim d
ON d.InventDimId = t.InventDimId
AND d.DataAreaId = t.DataAreaId
WHERE i.DimGroupId <> N'SER'
AND t.DatePhysical > N'1900-01-01'
AND t.DatePhysical <= @Date
AND t.DataAreaId = @Company
GROUP BY i.ItemId, d.ConfigId
), ShipIssue AS
(
SELECT t.ItemId, t.ConfigId
, CAST(CAST(SUM(t.Qty) AS NUMERIC(20, 2)) AS FLOAT) Qty
FROM
(
SELECT t.DataAreaId, t.ItemId, d.ConfigId, t.DatePhysical TransDate
, CAST(CAST(t.Qty * -1 AS NUMERIC(20, 2)) AS FLOAT) Qty
FROM AX4.dbo.InventTrans t
INNER JOIN AX4.dbo.InventDim d
ON d.InventDimId = t.InventDimId
AND d.DataAreaId = t.DataAreaId
WHERE ((t.TransType = 0 AND StatusIssue = 1)
OR (t.TransType = 8 AND StatusIssue = 2))
) t
INNER JOIN AX4.dbo.InventTable i
ON i.ItemId = t.ItemId
AND i.DataAreaId = t.DataAreaId
WHERE i.DimGroupId <> N'SER'
AND t.TransDate >= DATEADD(DAY, 1, DATEADD(YEAR, -1, @Date))
AND t.TransDate < DATEADD(DAY, 1, @Date)
AND t.DataAreaId = @Company
GROUP BY t.ItemId, t.ConfigId
HAVING SUM(t.Qty) <> 0
), TurnOver AS
(
SELECT i.ItemId, i.ConfigId
, i.Qty InventQty
, s.Qty ShipIssueQty
, CASE
WHEN ISNULL(s.Qty, 0) = 0 THEN NULL
ELSE CAST(i.Qty / s.Qty AS NUMERIC(10, 4))
END ITOS
FROM Invent i
LEFT JOIN ShipIssue s
ON s.ItemId = i.ItemId
AND s.ConfigId = i.ConfigId
), TurnOverLevel AS
(
SELECT *,
CASE
WHEN InventQty < 0 OR ShipIssueQty < 0 THEN N'Others'
WHEN ITOS > 5 OR (ShipIssueQty IS NULL AND InventQty > 0) THEN N'>5'
WHEN ITOS <= 5 AND ITOS > 2 THEN N'>2 - 5'
WHEN ITOS <= 2 AND ITOS > 0.5 THEN N'>0.5 - 2'
WHEN ITOS <= 0.5 AND ITOS > 0.2 THEN N'>0.2 - 0.5'
WHEN ITOS <= 0.2 AND ITOS > 0.05 THEN N'>0.05 - 0.2'
WHEN ITOS <= 0.05 AND ITOS > 0 THEN N'>0 - 0.05'
WHEN ITOS = 0 OR InventQty = 0 THEN N'0'
END [Level]
FROM TurnOver
), TurnOverCost AS
(
SELECT t.*
, CASE
WHEN i.ItemDimCostPrice = 1 THEN CAST(c.CostPrice + c.Markup / CASE WHEN c.PriceQty = 0 THEN 1 ELSE c.PriceQty END AS MONEY)
ELSE CAST(m.Price AS MONEY)
END CostPrice
, i.ItemName, e.ElementNameENG ItemType, i.ItemGroupId ItemGroup, f.ItemStatus
FROM TurnOverLevel t
INNER JOIN AX4.dbo.InventTable i
ON i.ItemId = t.ItemId
AND i.DataAreaId = @Company
INNER JOIN dbo.AxEnum e
ON e.EnumName = N'ItemType'
AND e.ElementValue = i.ItemType
LEFT JOIN AX4.dbo.ConfigTable f
ON f.ItemId = t.ItemId
AND f.ConfigId = t.ConfigId
AND f.DataAreaId = i.DataAreaId
LEFT JOIN AX4.dbo.InventDimCombination c
ON c.ItemId = i.ItemId
AND c.ConfigId = t.ConfigId
AND c.DataAreaId = i.DataAreaId
AND i.ItemDimCostPrice = 1
LEFT JOIN AX4.dbo.InventTableModule m
ON m.ItemId = t.ItemId
AND m.DataAreaId = @Company
AND i.ItemDimCostPrice = 0
AND m.ModuleType = 0 --库存
)
SELECT ItemId, ItemName, ConfigId, ItemType, ItemGroup, ItemStatus
, CostPrice, InventQty
, CAST(InventQty * CostPrice AS MONEY) InventValue
, ShipIssueQty
    , CAST(ShipIssueQty * CostPrice AS MONEY) ShipIssueValue
, ITOS, [Level]
FROM TurnOverCost出现超时错误, 而在分析器中只需要1-2秒中就出结果了

解决方案 »

  1.   

    原因是 SQL语句的执行效率太低,所需要的时间比较长。
    解决方法
    1 优化SQL语句。
    2 设置程序中连接超时的时间。但是建议优化SQL语句,每个电脑的性能不同,具体你也不知道
    每台电脑执行需要多久。
      

  2.   


    那为什么在SQL Server Management Studio内执行只要1-2秒呢
    不都是在服务器上执行的吗?
      

  3.   

    sql会发到数据库服务器执行。
    先把你的数据库连接超时时间设长一些。