T- SQL Курсоры чередуются в BigQuery - PullRequest
1 голос
/ 14 января 2020

У меня есть хранимая процедура, написанная на T- SQL, в которой используются курсоры, но теперь я хочу использовать ее в Google BigQuery. Я переписываю запрос в GBQ, но не знаю, как конвертировать логи курсора c, потому что bigquery его не поддерживает. Ниже приведен скрипт T- SQL, который я хочу преобразовать в BigQuery:

DECLARE
    @query              cursor,
    @wm_query           cursor,

    @passenger_id       varchar(48),
    @trip_no            nvarchar(255),
    @created_at         datetime2(7) ,
    @prev_cash_balance  numeric(18,5),
    @prev_promo_balance numeric(18,5),
    @_id                nvarchar(255)

SET @query = CURSOR FAST_FORWARD FOR
    SELECT passenger_id, trip_no, created_at, _id
    FROM source_wallet
    ORDER BY passenger_id, created_at, _id

OPEN @query
FETCH NEXT FROM @query INTO @passenger_id, @trip_no, @created_at, @_id

    WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @wm_query = CURSOR FAST_FORWARD FOR
        select top 1 cash_balance, promo_balance from wallet_master where passenger_id = @passenger_id 
        order by created_at desc, _id desc

            OPEN @wm_query
            FETCH NEXT FROM @wm_query into @prev_cash_balance, @prev_promo_balance

                insert into wallet_master (passenger_id, created_at, cash_usage, promo_usage, _id)
                select @passenger_id, @created_at, case<some logic>, case<some logic>, _id

            CLOSE @wm_query
            deallocate @wm_query
        FETCH NEXT FROM @query into @passenger_id, @trip_no, @created_at, @_id          
    END
CLOSE @query
DEALLOCATE @query

1 Ответ

1 голос
/ 14 января 2020

Сначала я не смог переписать ваш код в BigQuery из-за отсутствия фиктивных данных и невозможности воспроизвести дело. Однако я могу дать вам указатели, чтобы начать переписывать ваш код.

1st) Вы можете использовать временные таблицы с WITH предложение в BigQuery для преобразования ваших данных вместо использования FAST_FORWARD FOR . Стандартный SQL Синтаксис запроса можно найти здесь . Кроме того, я хотел бы отметить, что вы можете иметь несколько временных таблиц одновременно.

2nd) Согласно документации , возможно использование сценариев в BigQuery , Таким образом, LOOPS доступны с различными встроенными методами.

3-ий) Кроме того, синтаксис IF также доступен в BigQuery, соответствующую документацию можно найти здесь .

4th) Я также призываю вас взглянуть на ОБЪЯВИТЬ и SET операторы , которые могут помочь в создании и обработке переменных, необходимо указать, что нельзя использовать параметризованные переменные в качестве имен таблиц в BigQuery.

5th) Я полагаю, что эта статья также поможет понять параметризацию в BigQuery.

Я рекомендую вам начать писать свой код в BigQuery, а затем, если у вас есть другие вопросы, вы можете задать их здесь.

Дайте мне знать, если вам понадобится дополнительная помощь. Я надеюсь, что это было полезно.

...