WAITFOR DELAY不会在每个WHILE循环中单独起作用

时间:2019-04-10 13:38:45

标签: sql sql-server tsql delay wait

我一直在教自己如何使用WHILE循环,并决定尝试进行有趣的Russian Roulette模拟。也就是说,一个查询将随机选择(或打印)最多6条语句(左轮手枪的每个小室一个),最后一条显示为“您死了!”。以及任何之前读到的“您生存”。

我首先创建了一个表htop,该表包含以随机顺序排列的数字1-6。然后,我有一个WHILE循环,如下所示,如果选择了包含“子弹”(1)的小室,则会出现BREAK(我知道选择随机数的方法更简单,但这是我之前玩过的其他方法的改编我对此没有兴趣):

kill

这很好用,但是结果都是立即显示的,我想在每一个之间添加一个延迟,以增加压力。

我尝试如下使用WAITFOR DELAY:

#Nums

我希望WAITFOR DELAY最初引起3秒钟的延迟,然后执行第一个SELECT语句,使文本出现在结果网格中,然后假定未选择活动腔室,还要再延迟3秒,依此类推,直到选择了直播室。

但是,在结果网格中没有出现任何内容之前,每执行一条SELECT语句会有3秒钟的延迟,此后所有结果将同时出现。 我尝试使用PRINT而不是SELECT,但是遇到相同的问题。

很明显,这里我缺少一些东西-有人可以阐明吗?

1 个答案:

答案 0 :(得分:3)

这称为缓冲。服务器不想返回仅部分完整的响应,因为在大多数情况下,需要考虑所有网络开销。许多非常小的数据包比一些较大的数据包 1 贵。

如果您使用RAISERROR(不用担心我们使用10的名称),则可以指定NOWAIT说“立即发送”。 PRINT并没有返回结果集的等效项:

SET NOCOUNT ON

CREATE TABLE #Nums ([Num] INT)
DECLARE @Count INT = 1
DECLARE @Limit INT = 6
DECLARE @Number INT

WHILE @Count <= @Limit
BEGIN
SET @Number = ROUND(RAND(CONVERT(varbinary,NEWID()))*@Limit,0,1)+1
IF NOT EXISTS (SELECT [Num] FROM #Nums WHERE [Num] = @Number)
BEGIN
INSERT INTO #Nums VALUES(@Number)
SET @Count += 1
END
END

DECLARE @Chamber INT

WHILE 1=1
BEGIN
WAITFOR DELAY '00:00:03'
  SET @Chamber = (SELECT TOP 1 [Num] FROM #Nums)
    IF @Chamber = 1
    BEGIN
      RAISERROR('you die!, Unlucky',10,1) WITH NOWAIT
      BREAK
    END
   RAISERROR('you survive., Phew...',10,1) WITH NOWAIT
  DELETE FROM #Nums WHERE [Num] = @Chamber
END

DROP TABLE #Nums

Larnu已经坚持使用in comments,这不是T-SQL的使用。

SQL是一种面向集合的语言。我们尝试 not 编写过程代码(执行此操作,然后执行该操作,然后多次运行此代码块)。我们尝试在单个查询中尽可能多地提供服务器,并让它 it 确定如何处理它。虽然T-SQL 确实对循环具有语言支持,但我们尽可能避免使用循环。


1 我在这里宽松地使用数据包非常。请注意,无论实际上使用哪种网络(或no-networking-local-memory)选项来承载客户端和服务器之间的连接,它都应用相同的优化。

相关问题