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