我想运行无限循环

时间:2018-01-31 14:13:43

标签: sql-server

1 - 使用SQL Server 2014,如何编辑此代码? 2 - 如果不满足条件再次返回条件检查 3 - 如果检查条件正确 - 转到下一步 4 - 完成代码后再次返回第一个条件 我想运行无限循环 请参阅图片以获取说明enter image description here

    if not exists (
           select top 1 1 
            from sms.dbo.m_link
                 where link_check = 0
                )RETURN 
          WAITFOR DELAY '00:00:05'
      INSERT INTO sms.dbo.M_Out (MessageTo ,MessageType ,Gateway ,UserId) 
      select top 1 1 link_MessageTo ,link_MessageType ,link_Gateway ,link_UserId  
                  from sms.dbo.m_link
                 where link_check = 0
              WAITFOR DELAY '00:00:10'

1 个答案:

答案 0 :(得分:0)

使用您的图像和问题的更新,看起来您正在将记录排入m_link表,并希望一次将一条记录插入到m_out表中?我不确定这是最好的方法,但要回答你的问题,你可以使用While Loop,这通常是SQL Server中的一个脏词。

您目前拥有的代码逻辑已关闭,对于sql,它读取:

  

如果不存在(没有要插入的记录)

     

等几秒钟

     

插入表中没有任何记录的第一条记录   即将离任的表格。 (不合逻辑)

     

再等几秒钟

     

另一方面,如果记录确实存在SQL什么也不做,你还没告诉它你想做什么

我使用while loop的建议是基于能够完成你提出的任务,我犹豫不决,因为我怀疑这是最好的方法,但是除了以下附加信息之外代码应该完成你想要做的事情。

没有进一步的麻烦:

set nocount on;

--| Supporting Tables
declare @delete as table (
    m_linkID int not null
);

declare @m_Out as table (
    m_OutID int identity(73,1) not null primary key clustered
,   m_linkID int not null
,   link_MessageTo nvarchar(255) not null
,   link_MessageType int not null
,   link_Gateway int not null
,   link_UserID int not null
);

declare @m_link as table (
    m_linkID int identity(1,1) not null primary key clustered
,   link_MessageTo nvarchar(255) not null
,   link_MessageType int not null
,   link_Gateway int not null
,   link_UserID int not null
);

--| populate the m_link table with example records
insert into @m_link (link_MessageTo, link_MessageType, link_Gateway, link_UserID)

select 'Message One', 1, 42, 666 union all
select 'Message Two', 1, 57, 99;

--| show the inserted records
select *
  from @m_link

--| evaluate the table for records (Start - While Loop)
 while exists (
                select 1
                  from @m_link
                )

begin
    --| 'move' records into the m_out table
    insert into @m_out (m_linkID, link_MessageTo, link_MessageType, link_Gateway, link_UserID)
    output inserted.m_linkID
      into @delete

    select top 1 m_linkID
         , link_MessageTo
         , link_MessageType
         , link_Gateway
         , link_UserID
      from @m_link

    --| remove the record from the m_link table
    delete 
      from @m_link
     where m_linkID in (
                        select m_linkID
                          from @delete
                          )

end;

select *
  from @m_Out

select *
  from @m_link

Ops问题更新前的先前答案

您可以使用您正在使用的SQL Server版本进行标记,并更详细地解释所有方案和目标。

你可以试试这个:

   if not exists (
                    select 1
                      from sms.dbo.m_link
                     where link_check = 0
                    )

我担心的是您正在尝试在基于集合的世界中实施RBAR解决方案。如果您尝试根据具有Y的行执行X,则该方法是错误的。