我有这个问题..
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中的所有列?
提前致谢
答案 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的操作不适用时才使用它们。这完全取决于你想要实现的目标 - 游标可能非常耗费资源,如果你不小心你应用的提示,可能会导致锁定的记录/表格。