Хранимая процедура всегда возвращает один и тот же запрос - PullRequest
0 голосов
/ 24 мая 2019

Я пытался написать запрос SQL, чтобы получить результаты с некоторыми параметрами, но когда я отправляю параметры, это не работает. Всегда возвращает последний запрос в условии if else.

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[sp_RealEstatesList]
   @TransCode NVARCHAR(5),
   @CatUrl NVARCHAR(255) = NULL,
   @ForSaleItem BIT = NULL,
   @NewItem BIT = NULL,
   @ItemOfDay BIT = NULL,
   @Random BIT = NULL,
   @Top INT = NULL
AS
   SET NOCOUNT ON
   SET XACT_ABORT ON  
   SET FMTONLY OFF

   BEGIN TRAN

   IF (OBJECT_ID('tempdb..#TempTable') IS NOT NULL)
   BEGIN
       DROP TABLE #TempTable
   END

    SELECT 
        R.[ID],
        RT.[Title],
        R.[Price],
        R.[NewItem],
        R.[ForSaleItem],
        R.[ItemOfDay],
        R.[Url],
        (SELECT TOP 1 CC.Url
         FROM [dbo].[Category] CC
         JOIN [dbo].[LinkTypes] LLT ON LLT.[MainID]  = CC.ID
         JOIN [dbo].[Links] LL ON LL.[LinkTypeID] = LLT.[ID]
         JOIN [dbo].[RealEstates] RR  ON RR.[ID] = LL.LinkID
         WHERE LLT.[LinkedTypeID] = 17 
           AND LLT.[MainTypeID] = 1 
           AND RR.ID = R.[ID]) AS 'CatUrl',
        (SELECT TOP 1 
             (SELECT TOP 1 XC.Url 
              FROM Category XC
              JOIN [dbo].[LinkTypes] LLT ON LLT.[MainID]  = XC.ID
              JOIN [dbo].[Links] LL ON LL.[LinkTypeID] = LLT.[ID]
              WHERE LLT.[LinkedTypeID] = 1 
                AND LLT.[MainTypeID] = 1 
                AND LL.LinkID = CC.ID)
         FROM [dbo].[Category] CC
         JOIN [dbo].[LinkTypes] LLT ON LLT.[MainID]  = CC.ID
         JOIN [dbo].[Links] LL ON LL.[LinkTypeID] = LLT.[ID]
         JOIN [dbo].[RealEstates] RR  ON RR.[ID] = LL.LinkID
         WHERE LLT.[LinkedTypeID] = 17 
           AND LLT.[MainTypeID] = 1 
           AND RR.ID = R.[ID]) AS 'PCatUrl'
   INTO 
       #TempTable
   FROM 
       [dbo].[RealEstates] R 
   JOIN
       [dbo].[RealEstatesT] RT ON R.[ID] = RT.[RealEsID]
   JOIN
       [dbo].[LinkTypes] LT ON LT.[MainTypeID] = 17
   JOIN 
       [dbo].[Links] L ON L.[LinkTypeID] = LT.[ID]
   JOIN
       [dbo].[Translation] TR ON TR.[ID] = RT.[TransID]
   WHERE 
       R.[Active] = 1
       AND R.[Deleted] = 0
       AND RT.[Deleted] = 0
       AND LT.[LinkedTypeID] = 5 
       AND LT.[MainID]  = R.[ID]
       AND TR.[ShortName] = @TransCode
   GROUP BY
       R.[ID], RT.[Title], R.[Price], R.[NewItem], R.[ForSaleItem], R.[ItemOfDay], R.[Url]


   if (@Top = null or @Top = 0)
   begin
      set @Top = 100000;
   end


   if(@NewItem != null)
   begin
      select TOP (@Top) [ID],[Title],[Price],[NewItem],[ForSaleItem],[CatUrl],[PCatUrl],[ItemOfDay],[Url]
      from #TempTable
      where NewItem = @NewItem
      order by case when @Random = 1 then NEWID() end
   end

   else if(@ForSaleItem != null)
   begin
      select TOP (@Top) [ID],[Title],[Price],[NewItem],[ForSaleItem],[CatUrl],[PCatUrl],[ItemOfDay],[Url]
      from #TempTable
      where ForSaleItem = @ForSaleItem
      order by case when @Random = 1 then NEWID() end
   end

   else if(@CatUrl != null)
   begin
      select TOP (@Top) [ID],[Title],[Price],[NewItem],[ForSaleItem],[CatUrl],[PCatUrl],[ItemOfDay],[Url]
      from #TempTable
      where CatUrl = @CatUrl or PCatUrl = @CatUrl
      order by case when @Random = 1 then NEWID() end
   end

   else if(@ItemOfDay != null)
   begin
      select TOP (@Top) [ID],[Title],[Price],[NewItem],[ForSaleItem],[CatUrl],[PCatUrl],[ItemOfDay],[Url]
      from #TempTable
      where ItemOfDay = @ItemOfDay
      order by case when @Random = 1 then NEWID() end
   end

   else
   begin
      select TOP (@Top) [ID],[Title],[Price],[NewItem],[ForSaleItem],[CatUrl],[PCatUrl],[ItemOfDay],[Url]
      from #TempTable
      order by case when @Random = 1 then NEWID() end
   end

COMMIT

Параметры Transcode и Random работают хорошо, но параметры CatUrl, ForSaleItem, NewItem, ItemOfDay не работают. Всегда возвращает последний запрос в условии if else.

Надеюсь, вы можете помочь. Я жду ваших ответов.

редактировать:

Я изменил все свои нулевые проверки, например, «NULLIF (@Top, '') IS NULL» и теперь, если операторы работают хорошо.

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