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

Posted

技术标签:

【中文标题】SSE 2005 存储过程在管理工作室中工作,但不在 C# DAL 中【英文标题】:SSE 2005 stored Procedure working in management studio but not in C# DAL 【发布时间】:2010-07-30 07:18:38 【问题描述】:

我已经创建了一个存储过程

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# 应用程序中添加这个 SP 并使用 TableAdapter 预览窗口预览数据时,在第一次运行时显示数据需要 8-10 秒,在第二次运行时预览窗口抛出超时异常.我还添加了一个带有常规 SQL 的新 TableAdapter 来确认这个问题,但常规 SQL GetData 函数运行良好。

我不明白如何在 Management Studio 中使用相同的用户名和密码很好地运行相同的程序,而不是在 DAL 中运行。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

您应该捕获在 DAL 下运行的存储过程的执行计划,并将其与在 Management Studio express 下运行的执行计划进行比较 - 您可以使用 Sql Server Profiler 来做到这一点。

还要确保您正在使用完全相同相同的参数运行存储过程(使用 Sql Server Profiler 从 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...

我已经看到这在某些情况下会产生重大影响。

【讨论】:

以上是关于SSE 2005 存储过程在管理工作室中工作,但不在 C# DAL 中的主要内容,如果未能解决你的问题,请参考以下文章

android:在模拟器中工作但不在手机上的联系人提供程序

Sybase SQL Anywhere:LOAD TABLE 函数是不是在存储过程中工作?

sbt dist在终端中工作但不与Jenkins一起作为shell脚本

如何让我的存储过程在我的 Visual Studio 项目中工作?

无法让CImage在Visual C ++ 2005(MFC)中工作

从 Java 启动 OpenOffice 服务 (soffice) 的问题(在命令行中工作的命令,但不是从 Java 中)