循环存储过程中的记录

时间:2014-01-08 17:00:25

标签: sql sql-server sql-server-2008

我有这个问题..

Begin
   declare @Col int,
           @lev int,
           @Plan int

select @Col = 411
select @lev = 16
select @Plan = 780             

--Insert into baCodeLibrary(Plan_Num,Level_Num,Column_Num,Block_Num,Code_Id,Sort_Order,isactive,Added_By,DateTime_Added,Updated_By,DateTime_Updated)
Select Distinct 
    @plan,
    @lev,
    @col,
    ba_Object_Id - 5539,
    ba_Object_Id, 
    ba_OBject_Desc, 
    ba_Object_Id - 5539,
    1,
    'xyz',
    GETDATE(),
    'xyz',
    GETDATE()
from baObject 
where ba_OBject_Id > 5539 
    and ba_Object_Id < 5554

end

这里我只有@col = 411,但我想循环所有列,直到489

是否有人可以帮我解决如何在此查询中编写循环以选择411到489中的所有列?

提前致谢

3 个答案:

答案 0 :(得分:2)

如何在循环方面不考虑这个问题,而是根据集合来考虑它?

declare @lev int,
        @Plan int;

select @lev = 16,
       @Plan = 780;

;WITH n(n) AS 
(
  SELECT TOP (489-411) Number 
    FROM master.dbo.spt_values 
    WHERE type = N'P' ORDER BY Number
)
--Insert dbo.baCodeLibrary(...)
SELECT DISTINCT
  @plan,
  @lev,
  n.n,
  ba.ba_Object_Id - 5539,
  ba.ba_Object_Id, 
  ba.ba_Object_Desc, 
  ba.ba_Object_Id - 5539,
  1,
  'xyz',
  GETDATE(),
  'xyz',
  GETDATE()
FROM dbo.baObject AS ba CROSS JOIN n
  where ba.ba_Object_Id > 5539 
  and ba.ba_Object_Id < 5554;

答案 1 :(得分:0)

现在您的查询中没有实际的循环机制。您需要实现类似while循环的功能才能获得该功能。

请参阅:http://technet.microsoft.com/en-us/library/ms178642.aspx

它看起来像

DECLARE @counter int
SET @counter = 1

WHILE @counter < 10
BEGIN

-- loop logic

SET @counter = @counter + 1
END

答案 2 :(得分:0)

循环可以在T-SQL中以三种方式执行; WHILE循环,基于SET的操作或CURSOR

T-SQL / SQL Server针对基于SET的操作进行了优化,它们是最有效的循环方式,但这一切都取决于您要实现的目标。

有充分理由,你可能会被游戏警告,但只要你明白自己在做什么,它们就完全可以接受。这是一个非常简单,快速的游标示例:

DECLARE @myColumn VARCHAR(100)

DECLARE cTmp CURSOR FAST_FORWARD FOR
SELECT MyColumn
FROM MyTable (nolock)

OPEN cTmp

FETCH NEXT FROM cTmp INTO @myColumn

WHILE @@FETCH_STATUS = 0
    BEGIN
        -- Do something with @myColumn here
        FETCH NEXT FROM cTmp INTO @myColumn
    END
CLOSE cTmp
DEALLOCATE cTmp

GO

请勿在未先阅读游标的情况下使用此代码 - 仅在基于SET的操作不适用时才使用它们。这完全取决于你想要实现的目标 - 游标可能非常耗费资源,如果你不小心你应用的提示,可能会导致锁定的记录/表格。

相关问题