Google bigquery T-SQL游标在BigQuery中交替使用

Google bigquery T-SQL游标在BigQuery中交替使用,google-bigquery,database-cursor,Google Bigquery,Database Cursor,我有一个用T-SQL编写的存储过程,它使用游标,但现在我想在Google BigQuery中使用它。我正在用GBQ重新编写查询,但不知道如何转换游标逻辑,因为bigquery不支持它。下面是我要转换为BigQuery的T-SQL脚本: DECLARE @query cursor, @wm_query cursor, @passenger_id varchar(48), @trip_no

我有一个用T-SQL编写的存储过程,它使用游标,但现在我想在Google BigQuery中使用它。我正在用GBQ重新编写查询,但不知道如何转换游标逻辑,因为bigquery不支持它。下面是我要转换为BigQuery的T-SQL脚本:

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
声明
@查询游标,
@wm_查询游标,
@乘客id varchar(48),
@脱扣器无nvarchar(255),
@于datetime2(7)创建,
@上一次现金余额数字(18,5),
@上一次促销余额数字(18,5),
@_id nvarchar(255)
设置@query=光标快进
选择乘客id、行程编号、创建地点、id
来源:钱夹
按乘客id订购,在创建时创建,id
打开@query
将下一个从@query获取到@passenger\u id、@trip\u no、@created\u at、@id
而@@FETCH\u STATUS=0
开始
设置@wm\u query=光标快进
选择前1名现金余额、钱包主卡促销余额,其中乘客id=@passenger\u id
订单由在描述处创建,标识描述
打开@wm_查询
从@wm\u查询获取下一个@prev\u现金余额、@prev\u促销余额
插入钱包主控卡(乘客id、创建地址、现金使用、促销使用、id)
选择@passenger\u id、@created\u at、case、case、\u id
关闭@wm_查询
取消分配@wm\u查询
将下一个从@query获取到@passenger\u id、@trip\u no、@created\u at、@id
结束
关闭@query
取消分配@query

由于缺少虚拟数据且无法重现案例,我起初无法将您的代码重写为BigQuery。但是,我可以给您一些指示,让您开始重新编写代码

1st)您可以在BigQuery中使用带有with子句的临时表对数据进行转换,而不是使用快进。可以找到标准的SQL查询语法。此外,我想指出的是,您可以同时拥有多个临时表

2)根据,可以在BigQuery中使用脚本。因此,循环可通过各种内置方法使用

3rd)此外,如果在BigQuery中也提供了语法,您可以找到适当的文档

4th)我还建议您查看一下DECLARESET,它们可以帮助创建和操作变量,必须指出的是,您不能在BigQuery中使用参数化变量作为表名

5)我相信这也有助于理解BigQuery中的参数化

我鼓励您开始在BigQuery中编写代码,如果您有任何其他问题,可以在这里询问

如果你需要更多的帮助,请告诉我。我希望它有用