Альтернатива динамическому запросу в SSRS - PullRequest
0 голосов
/ 13 марта 2012

Нужна помощь, ребята.

У меня есть хранимая процедура, которая отображает все записи.

    SELECT 
     Entity.Name as [ENTITY],   
     Product.Name AS [Product Name],   
     convert(date, whseintg.TrnDate) as TrnDate,
     DOGR.AppNo,     
     DOGR.TrnNo,   
     DOGR.TrnType,   
     DOGR.StkId,   
     DOGR_D.ProdId,   
     DOGR_D.Qty,   
     DOGR_D.QtyIn,   
     DOGR_D.UPrice,   
     Ratio.Ratio  
FROM Entity WITH ( NOLOCK ),   
     Product WITH ( NOLOCK ),   
     DOGR WITH ( NOLOCK ),   
     DOGR_D WITH ( NOLOCK ),   
     Ratio WITH ( NOLOCK ),
     whseintg WITH (Nolock)  
WHERE ( DOGR_D.ProdId = Product.ProdId ) and  
     ( DOGR.TrnType = DOGR_D.TrnType ) and  
     ( DOGR.AppNo = DOGR_D.AppNo ) and   
     ( DOGR_D.RatioId = Ratio.Ratioid ) and
        ( DOGR.TrnType = whseintg.TrnType ) and  
     ( DOGR.Appno = whseintg.TrnNo ) and        
        ( DOGR.TrnNo is not null ) and      
     ( ( dbo.DOGR.TrnType = 'SCR' ) )  and
     ( dbo.DOGR.LocID = dbo.Entity.LocID) 

Теперь у меня есть определенные параметры, такие как @FromProductName и @ToProductName вдизайн-представление отчета.

Я не хочу использовать динамические запросы, потому что это повлияет на производительность приложения.Что я хочу, так это то, что если в обе переменные передается значение, запрос будет выглядеть примерно так:

    SELECT 
     Entity.Name as [ENTITY],   
     Product.Name AS [Product Name],   
     convert(date, whseintg.TrnDate) as TrnDate,
     DOGR.AppNo,     
     DOGR.TrnNo,   
     DOGR.TrnType,   
     DOGR.StkId,   
     DOGR_D.ProdId,   
     DOGR_D.Qty,   
     DOGR_D.QtyIn,   
     DOGR_D.UPrice,   
     Ratio.Ratio  
FROM Entity WITH ( NOLOCK ),   
     Product WITH ( NOLOCK ),   
     DOGR WITH ( NOLOCK ),   
     DOGR_D WITH ( NOLOCK ),   
     Ratio WITH ( NOLOCK ),
     whseintg WITH (Nolock)  
WHERE ( DOGR_D.ProdId = Product.ProdId ) and  
     ( DOGR.TrnType = DOGR_D.TrnType ) and  
     ( DOGR.AppNo = DOGR_D.AppNo ) and   
     ( DOGR_D.RatioId = Ratio.Ratioid ) and
        ( DOGR.TrnType = whseintg.TrnType ) and  
     ( DOGR.Appno = whseintg.TrnNo ) and        
        ( DOGR.TrnNo is not null ) and      
     ( ( dbo.DOGR.TrnType = 'SCR' ) )  and
     ( dbo.DOGR.LocID = dbo.Entity.LocID) 
     and (DOGR_D.ProdId between @FromProdID and @ToProdID)

В противном случае он будет вести себя как исходный запрос.Это возможно?

Ответы [ 2 ]

3 голосов
/ 13 марта 2012

Вы можете попробовать переписать ваше окончательное условие:

 and (DOGR_D.ProdId between @FromProdID and @ToProdID)

в

 and DOGR_D.ProdId >= coalesce(@FromProdID, DOGR_D.ProdId) 
 and DOGR_D.ProdId <= coalesce(@ToProdID, DOGR_D.ProdId)
0 голосов
/ 13 марта 2012

Вы можете попробовать использовать оператор case в предложении where. Если оба параметра не равны нулю.

И ( СЛУЧАЙ
Когда @FromProductID не равен NULL и @ToProductID не имеет значения NULL THEN DOGR_D.ProdId КОНЕЦ Между @FromProductID И @ToProductID )

используйте условие Выше вместо

и (DOGR_D.ProdId между @FromProdID и @ToProdID)

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