недопустимое имя объекта — временная таблица выходит за рамки после exec, но я не знаю, как исправить

#sql-server #tsql #dynamic-sql #azure-sql-data-warehouse

#sql-server #tsql #динамический-sql #azure-sql-data-warehouse

Вопрос:

Во-первых, у меня нет никакого опыта работы с динамическим SQL, это моя первая попытка. я просматривал ответы здесь, но различные попытки исправить это не увенчались успехом, что привело меня в замешательство.

Я создал таблицу с циклическими месяцами [#Месяц], а также создал таблицу кодов транзакций [#Tran_codes], мне нужно объединить их с транзакционными данными, но я получаю недопустимое имя объекта ‘#Trans1’. я знаю, что это связано с тем, что временная таблица выходит за рамки, но я не знаю, как это исправить.

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

    -------------------------------------------------------------------
    PRINT '03. Create a Table with all Tran codes as per "02", with transaction amounts, per month-end date for past 25 months as set out by "01" '
    -------------------------------------------------------------------


    DECLARE 
         @i              INT
        ,@j              INT
        ,@Monthend_Date  varchar(50)
        ,@Month_String   VARCHAR(6)
        ,@SQL            VARCHAR(MAX)

    SET @i = 1
    SET @j = (SELECT MAX(RowNum) FROM #Month)

    WHILE @i <= @j
    BEGIN

        SET @Month_String   = (SELECT MonthString FROM #Month WHERE RowNum = @i)     

    IF @i = 1
    BEGIN

    ----------------------------------------------------------
    SET @SQL = '
            IF OBJECT_ID(''tempdb..#Trans1'') IS NOT NULL DROP TABLE #Trans
              CREATE TABLE #Trans1
              WITH
              (
               DISTRIBUTION = HASH(Tran_Date_Key)
               ,LOCATION = USER_DB
              )
               AS   
               SELECT
            Monthend_Date = '''   CONVERT(Varchar(30), @Monthend_Date)   '''
            ,Trans.Tran_Code_Key
            ,TD.Tran_Code
            ,TD.Description
            ,Amount
               FROM DATASTORE_MIS.[dbo].vwF_Transaction_'  @Month_String  ' Trans
            inner join DATASTORE_MIS.[dbo].vwF_Transaction_Description_'  @Month_String  ' as TD on Trans.Journal_No = TD.Journal_No
                                                                                    AND Trans.[Tran_Date_Key] = TD.[Tran_Date_Key]
               '

    EXEC (@SQL)

End
ELSE
BEGIN

    SET @SQL = '

        INSERT INTO #Trans1
        SELECT
        Monthend_Date = '''   CONVERT(Varchar(30), @Monthend_Date)   '''
        ,Trans.Tran_Code_Key
        ,TD.Tran_Code
        ,TD.Description
        ,Amount
        FROM DATASTORE_MIS.[dbo].vwF_Transaction_'  @Month_String  ' Trans
        inner join DATASTORE_MIS.[dbo].vwF_Transaction_Description_'  @Month_String  ' as TD on Trans.Journal_No = TD.Journal_No
                                                                                    AND Trans.[Tran_Date_Key] = TD.[Tran_Date_Key]
               '
    EXEC (@SQL)
END

SET @i = @i   1

END
  

Комментарии:

1. Создайте временную таблицу с необходимой схемой перед выполнением динамического SQL и загрузите ее с помощью INSERT...SELECT инструкции dynamic SQL. После этого таблица будет доступна как во внешней, так и во внутренней области (динамические операторы SQL).

2. Добавлен azure-sql-data-warehouse тег к вашему вопросу на основе используемого вами синтаксиса.