Процедура SSE 2005 работает в студии управления, но не в C # DAL - PullRequest
1 голос
/ 30 июля 2010

Я создал хранимую процедуру

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 и выводит результаты, прежде чем я моргну. Но когда я добавил этот SP в C # App через слой доступа к данным и предварительно просмотрел данные с помощью окна предварительного просмотра TableAdapter , при первом запуске показ данных занял 8-10 секунд, а во втором запуске окна предварительного просмотра вызвали исключение Time Out. Я также добавил новый TableAdapter с обычным SQL, чтобы подтвердить эту проблему, но обычная функция SQL GetData работает хорошо.

Я не понимаю, как одна и та же процедура, которая прекрасно работает под тем же именем пользователя и паролем в Management Studio, не работает в DAL.

Любая помощь будет оценена.

1 Ответ

1 голос
/ 16 августа 2010

Вам следует записать план выполнения хранимой процедуры, выполняемой под DAL, и сравнить ее с процедурой, выполняемой в Management Studio Express, - это можно сделать с помощью Sql Server Profiler.

Также убедитесь, что вызапустив хранимую процедуру, используя точно с теми же параметрами (перехватите трассировку процедуры, выполняемой из вашего DAL с помощью профилировщика Sql Server, скопируйте и вставьте запрос в SQL Server Management Studio)

Наконец(это снимок в темноте) вы можете попробовать параметр, маскирующий ваши входные данные, поскольку я обнаружил, что в прошлом он имел некоторый эффект:

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...

Я видел, что это имеет все значение вопределенные ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...