Sql server BigQuery中SQL Server游标实现:根据获取的行值执行不同的操作

Sql server BigQuery中SQL Server游标实现:根据获取的行值执行不同的操作,sql-server,google-bigquery,Sql Server,Google Bigquery,我正在尝试将游标从SQLServer转换为BigQuery标准SQL。我们能用while循环吗?在BigQuery中编写光标下方场景的最佳方法是什么?提前谢谢 declare @t1 int, @t2 int, @t3 int, @id int declare @name varchar(30), @status varchar(30) declare @cursor cursor set @cursor = cursor for select * from table_A open @c

我正在尝试将游标从SQLServer转换为BigQuery标准SQL。我们能用while循环吗?在BigQuery中编写光标下方场景的最佳方法是什么?提前谢谢

declare @t1 int, @t2 int, @t3 int, @id int
declare @name varchar(30), @status varchar(30)

declare @cursor cursor

set @cursor = cursor for select * from table_A

open @cursor
fetch next from @cursor into @t1, @t2, @t3, @id, @name, @status

while @@fetch_status = 0
begin

delete from table_B where id = @id

update table_B b 
set b.time = gettime() /*this can give different results if I try batch processing*/
where b.name = @name
and b.status = @status

if (@t1 is null and @t2 is null)
begin
insert into table_C (parent, child)
select 0, 0
end

if (@t2 is null and @t3 is null)
begin
insert into table_C (parent, child, level, is_above, is_below) /*this insert is different from above insert*/
select @t1, @t2, 3, 2, 1
end

fetch next from @cursor into @t1, @t2, @t3, @id, @name, @status
end

close @cursor

deallocate @cursor

正如Sabri所指出的,这里根本不需要游标/循环

下面(BigQuery标准SQL)以其简单的方式与您的初始逻辑相似,只是为了一对一地匹配您的循环内操作

DELETE FROM table_B
WHERE id IN (SELECT DISTINCT id FROM table_A)

UPDATE table_B b
SET time = CURRENT_TIMESTAMP() 
FROM table_A a
WHERE b.name = a.name
AND b.status = a.status

INSERT INTO table_C (parent, child)
SELECT 0, 0
FROM table_A
WHERE t1 IS NULL 
AND t2 IS NULL 

INSERT INTO table_C (parent, child, level, is_above, is_below) 
SELECT t1, t2, 3, 2, 1
FROM table_A
WHERE t2 IS NULL 
AND t3 IS NULL 

您不需要循环来执行这些操作。可以使用联接进行批处理操作。你能告诉我A表、B表和C表的结构吗?另外,fetch_状态来自哪里?你能用简单的英语解释一下你的逻辑吗?我是说,你想一步一步做什么step@rmesteves我想从表a中获取一条记录,并基于该记录的列值,从表B中删除一条记录,用当前时间戳更新表B的一条记录,然后在表C中插入一些内容(基于A的列值有不同的insert语句——有点像case语句)。这是我的要求。@SabriKaragönen我之所以考虑循环,是因为有一个update语句用当前时间戳更新表_B记录。如果我使用批处理语句,我会得到不同的结果。这是我主要关心的问题。我用注释更新了我的代码以强调这一点。“当前_时间戳()“in update与我从上面的SQL代码中得到的不同?我的意思是,当我在更新第一条记录后花一些时间检查insert语句时,第二条记录的时间戳会发生很大的变化。但是如果我进行批处理,我将失去这一功能。不是吗?显然会有相同的时间戳,但从技术上讲是sp。”即使在ms sql cursor中,计算速度也应该足够高,以使差异不会超过一秒钟。但最重要的是,从任何实际的角度来看,原始脚本中的逻辑都非常简单,捕捉精确到毫秒的时间没有多大意义和实际用途我同意你的观点在这方面,se的数量很少,甚至没有。但这是我的要求。如果我必须这样做,使用循环是我唯一的选择吗?我认为如果捕获单个时间戳是一个可靠的要求,那么循环是唯一的选择。但是你应该和给你这个要求的人沟通,并解释利弊!显然,从任何角度来看,基于集合的处理都是最有效的方法!不仅在性能方面,而且对BigQuery来说,最重要的是在成本方面,我会做到这一点。谢谢你,米哈伊尔。此外,我接受这个答案,因为它仍然在很大程度上涵盖了这个问题。