Как мы можем использовать условие if и else во временной таблице?

#sql-server #tsql

Вопрос:

Я пытаюсь заполнить временную таблицу на основе результата условия в SQL Server 2016.

Временная таблица в любом случае будет иметь ту же структуру, но будет заполнена с помощью другого запроса в зависимости от условия.

Приведенный ниже упрощенный пример сценария не выполняет проверку синтаксиса вставки блока ELSE с ошибкой:

В базе данных уже есть объект с именем «#oneyrcon».

Код:

 IF OBJECT_ID('TEMPDB..#ONEYRCON') IS NOT NULL   DROP TABLE #ONEYRCON  IF @name IN ('asd', 'TVS')  SELECT tre.Dealermasterzone, tre.Dealermasterstate   INTO #ONEYRCON  FROM [dbo].[T_RE_POLICY_TRANSACTION] tre   INNER JOIN #ONEYRBASEEXPIRY ony ON tre.ChassisNo = ony.chassisno   WHERE (CAST(InsPolicyCreatedDate AS date) BETWEEN @FirstDayCon AND @LastDayCon   AND BusinessType = @Name   AND (ony.PolExpDateSub lt;= CAST(tre.InsPolicyCreatedDate AS date)))   OR (@lastdayC lt; @lastdayM --and @lastdayc lt;gt; @LastDayCon  AND CAST(InsPolicyCreatedDate AS date) BETWEEN @FirstDayCon AND @LastDayC   AND BusinessType = @Name)  GROUP BY  tre.Dealermasterzone, tre.Dealermasterstate  ELSE   SELECT tre.Dealermasterzone, tre.Dealermasterstate   INTO #ONEYRCON  FROM [dbo].[T_RE_POLICY_TRANSACTION] tre   INNER JOIN #ONEYRBASEEXPIRY ony ON tre.ChassisNo = ony.chassisno   AND tre.currentyearIcName = ony.CurrentYearICName  WHERE  (CAST(InsPolicyCreatedDate AS date) BETWEEN @FirstDayCon AND @LastDayCon   AND BusinessType = @Name   AND (ony.PolExpDateSub lt;= CAST(tre.InsPolicyCreatedDate AS date)))   OR (@lastdayC lt; @lastdayM --and @lastdayc lt;gt; @LastDayCon  AND CAST(InsPolicyCreatedDate AS date) BETWEEN @FirstDayCon AND @LastDayC   AND BusinessType = @Name)  GROUP BY  tre.Dealermasterzone,tre.Dealermasterstate  

Это единственный вариант? Или есть какой-то способ заставить это работать?

Ответ №1:

Создайте пустую временную таблицу перед тем, как если

 IF OBJECT_ID('TEMPDB..#ONEYRCON') IS NOT NULL  DROP TABLE #ONEYRCON  SELECT tre.Dealermasterzone, tre.Dealermasterstate INTO #ONEYRCON FROM [dbo].[T_RE_POLICY_TRANSACTION] tre WHERE 1 = 0  IF @name IN ('asd', 'TVS')  INSERT #ONEYRCON SELECT tre.Dealermasterzone, tre.Dealermasterstate FROM   [dbo].[T_RE_POLICY_TRANSACTION] tre ... ELSE  INSERT #ONEYRCON SELECT tre.Dealermasterzone, tre.Dealermasterstate FROM   [dbo].[T_RE_POLICY_TRANSACTION] tre ....  

Ответ №2:

Просто идея.

Используйте только 1 запрос, но с дополнительным условием в соединении.

 INNER JOIN #ONEYRBASEEXPIRY ony   ON tre.ChassisNo = ony.chassisno   AND (@name IN ('asd','TVS') OR tre.currentyearIcName = ony.CurrentYearICName)   

Или, может быть, если вы сделаете DROP TABLE и то и другое в IF и то ELSE .