2012-05-24 10 views
20

Ich kann nicht erklären, warum (oder vielleicht können Sie einfach nicht tun) ich die außerhalb des Bereichs Fehlermeldung erhaltenWie behebt "Muss die Skalarvariable deklarieren" Fehler beim Verweisen auf Tabellenvariable? So

muss die skalare Variable „@CompanyGroupSites_Master deklarieren.

ist es, dass ich nicht meine Tabelle Variable auf diese Weise in meinem Cursor zugreifen oder muss ich einfach etwas übersehen haben, dass sich außerhalb des Geltungsbereichs dieser Tabelle Variable zu halten, wenn aus dem Cursor Körper werben?

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

warum Sie einen Cursor für diese Verwendung? Und warum oh warum benutzt du @@ identity, wenn du OUTPUT oder scope_identity() verwenden solltest (@@ Identity kann schwerwiegende Datenintegritätsprobleme verursachen und sollte nicht auf diese Weise verwendet werden) – HLGEM

+0

im Moment benutze ich einen Cursor, weil ich T nicht kenne -SQL für ein Loch im Boden für Iterationsschleifen. Ich werde das zum Besseren ändern, nachdem ich es funktioniert habe. Mist, ja, es ist schon eine Weile her, ich habe Scope_identity vergessen – PositiveGuy

+0

was könnte ich anders als einen Cursor verwenden? Weil ich nicht einfach eine Crud-Operation mache, die in einem 2-Liner durchgeführt werden kann, um diese iterative Schleife zu ersetzen. Rat? – PositiveGuy

Antwort

46

Dies ist ein long standing parser issue. Sie müssen das Tabellenpräfix loswerden oder es in eckige Klammern einschließen.

heißt

delete from @CompanyGroupSites_Master 
where CompanyGroupID = @CompanyGroupID 

oder

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

Nicht

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

duh mcfly. Vielen Dank. Ich bin nicht wirklich ein T-SQL-Master, mehr OOP Guy grundlegende proc Cruds – PositiveGuy

+4

Vielen Dank! Ich habe mir in den letzten paar Stunden die Haare ausgerissen, um zu verstehen, warum SQL denkt, dass meine Tabellenvariable nicht deklariert ist! – CraigTP