2012-05-24 16 views
20

我想不通为什么(也许你不能做到这一点),我得到了范围错误如何解决引用表变量时“必须声明标量变量”的错误?

必须声明标量变量“@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 
+3

你为什么要使用此光标? AND为什么哦当你使用OUTPUT或scope_identity()时(@@ Identity会导致严重的数据完整性问题,并且不应该以这种方式使用),你为什么要使用@@ identity? – HLGEM

+0

现在使用游标导致我不知道T -SQL用于迭代循环的地面洞穴。在我工作之后,我会改变这一点。废话是啊,它已经有一段时间了,忘记了scope_identity – PositiveGuy

+0

除了游标,我还能用什么?因为我不是简单地做一个可以在2班轮中完成的crud操作来代替这个迭代循环。建议吗? – PositiveGuy

回答

46

这是long standing parser issue。您需要摆脱表格前缀或将其包装在方括号中。

delete from @CompanyGroupSites_Master 
where CompanyGroupID = @CompanyGroupID 

delete from @CompanyGroupSites_Master 
where [@CompanyGroupSites_Master].CompanyGroupID = @CompanyGroupID 

delete from @CompanyGroupSites_Master 
where @CompanyGroupSites_Master.CompanyGroupID = @CompanyGroupID 
+2

duh mcfly。谢谢。我不是一个真正的T-SQL大师,更多的OOP家伙基本proc cruds – PositiveGuy

+4

非常感谢!在过去的几个小时里,我一直在撕掉我的头发,试图理解为什么SQL认为我的表变量未声明! – CraigTP