【发布时间】:2012-05-31 11:28:29
【问题描述】:
我不知道为什么(或者你不能这样做)我得到了超出范围的错误
必须声明标量变量“@CompanyGroupSites_Master。
那么是我不能在光标内以这种方式访问我的表变量,还是我一定错过了一些简单的事情,即在从光标主体内引用时使表变量超出范围?
DECLARE @TotalCompaniesToProcess int
SET @TotalCompaniesToProcess = (select distinct Count(BusinessLine) from vwBuisinessUnit)
IF(@TotalCompaniesToProcess > 0)
BEGIN
---------------- ############# SETUP ############# ----------------
DECLARE @Companies TABLE (Company varchar(30))
Insert Into @Companies select distinct Company from Companies
DECLARE @CompanyGroups_Added TABLE(
CompanyGroupDesc varchar(50),
size varchar(50)
)
DECLARE @CompanyGroupSites_Added TABLE (
CompanyGroupID int,
CompanyID varchar(12)
)
DECLARE @CompanyGroupSites_Master TABLE (
CompanyGroupID int,
CompanyID varchar(12)
)
Insert into @CompanyGroupSites_Master select CompanyGroupID, CompanyID from Sec.CompanyGroupSites
DECLARE @CompanyGroupID int
DECLARE @Company int
---------------- END SETUP ----------------
---------------- UPDATE THE COMPANIES ----------------
DECLARE Companies_Cursor CURSOR FOR (select distinct BusinessLine from vwBuisinessUnit)
--select distinct BU, BusinessLine from vwBusinessUnit
Open Companies_Cursor
Fetch NEXT FROM Companies_Cursor into @Company
WHILE @@FETCH_STATUS = 0
BEGIN
-- is there an existing CompanyGroup for this Organization? If not create it
SET @CompanyGroupID = ( select CompanyGroupID from Sec.CompanyGroup
where size = 'Business'
and CompanyGroupDesc = @Company)
IF(@CompanyGroupID < 1)
BEGIN
INSERT INTO @CompanyGroups_Added ([CompanyGroupDesc], [Size])
VALUES (@Company, 'Business')
SET @CompanyGroupID = @@IDENTITY
select @CompanyGroupID as CompanyGroupID_Added -- testing
END
Select ToDelete.* from (
select CompanyGroupID, Company
from @CompanyGroupSites_Master
where @CompanyGroupSites_Master.CompanyGroupID = @CompanyGroupID) as ToDelete
delete from @CompanyGroupSites_Master where @CompanyGroupSites_Master.CompanyGroupID = @CompanyGroupID
Fetch NEXT FROM Companies_Cursor into @Company
END
CLOSE Companies_Cursor
DEALLOCATE Companies_Cursor
END
【问题讨论】:
-
你为什么要使用光标?以及为什么在您应该使用 OUTPUT 或 scope_identity() 时使用 @@identity(@@Identity 会导致严重的数据完整性问题,不应该这样使用)
-
现在使用游标,因为我不知道 T-SQL 是否有用于迭代循环的地洞。在我让它工作后,我会更好地改变它。废话,已经有一段时间了,忘记了scope_identity
-
除了光标我还能用什么?因为我不是简单地做一个可以在 2 班轮中完成的粗加工操作来替换这个迭代循环。建议?
-
@CoffeeAddict - 不确定您的代码到底在做什么。它有不用于任何东西的表变量,所以我认为它还没有完成?如果您使用的是 SQL Server 2008/2012,则可以查看
MERGE以基于集合的方式而不是逐行执行“如果不存在”逻辑。您可以使用OUTPUT子句检索插入行的详细信息(可能到表变量中)。顺便提一句。SELECT COUNT(BusinessLine)将始终只返回一行,因此DISTINCT在那里是多余的。
标签: sql-server tsql table-variable