SSE 2005存储过程在管理工作室中工作但不在C#DAL中

时间:2010-07-30 07:18:39

标签: sql-server-2005 stored-procedures

我创建了一个存储过程

CREATE PROCEDURE GetCustomerWiseSales(@StartDate nvarchar(10), @EndDate nvarchar(10))
AS

SELECT C.cCode, min(C.cName) as Customer, sum(P.BeerValue) as BeerValue, sum(P.RestGroup)as RestGroup
from Customers C
Join
(
SELECT     Sales.CustomerID, SUM(SalesLog.Quantity * SalesLog.Price) as BeerValue, 0 RestGroup
FROM         Sales INNER JOIN
                  SalesLog ON Sales.MemoNo = SalesLog.MemoNo
WHERE     (pGroup=8 and pSize>500) and Sales.Billdate>=@StartDate and Sales.Billdate<=@EndDate
group by  Sales.CustomerID

union all

SELECT     Sales.CustomerID, 0 BeerValue,SUM(SalesLog.Quantity * SalesLog.Price) AS RestGroup
FROM         Sales INNER JOIN
                  SalesLog ON Sales.MemoNo = SalesLog.MemoNo
WHERE     (pGroup!=8) and Sales.Billdate>=@StartDate and Sales.Billdate<=@EndDate
group by  Sales.CustomerID
)P
on P.CustomerID=C.cCode 
group by C.cCode

这个SP在Management Studio中运行良好,在我眨眼之前输出结果。但是当我通过数据访问层在C#App中添加此SP并使用 TableAdapter 预览窗口预览数据时,在第一次运行中显示数据需要8-10秒,在第二次运行中预览窗口会引发超时异常。我还添加了一个带有常规SQL的新TableAdapter来确认这个问题,但是常规的SQL GetData函数运行良好。

我不明白在Management Studio中如何使用相同的用户名和密码正常工作,而不是在DAL中工作。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

您应捕获在DAL下运行的存储过程的执行计划,并将其与Management Studio Express下运行的存储过程进行比较 - 您可以使用Sql Server Profiler执行此操作。

还要确保使用完全相同的参数运行存储过程(使用Sql Server探查器捕获从DAL执行的过程的跟踪,并将查询复制并粘贴到SQL Server中管理工作室)

最后(这是一个黑暗中的镜头)你可能想尝试参数屏蔽你的输入,因为我发现它在过去有一些效果:

CREATE PROCEDURE GetCustomerWiseSales(@StartDate nvarchar(10), @EndDate nvarchar(10))
AS

DECLARE @MaskedStartDate NVARCHAR(10)
SET @MaskedStartDate = @StartDate
DECLARE @MaskedEndDate NVARCHAR(10)
SET @MaskedEndDate = @EndDate 

-- Rest of query with @StartDate replaced with @MaskedStartDate etc...

我已经看到这在某些情况下会有所不同。