Вопрос по sql-server – Как исправить ошибку «Должен объявить скалярную переменную» при обращении к табличной переменной?

23

Я не могу понять, почему (или, может быть, вы просто не можете это сделать) я получаю ошибку вне области видимости

Must declare the scalar variable "@CompanyGroupSites_Master.

Так что я не могу получить доступ к своей переменной Table таким образом внутри моего Cursor, или я, должно быть, пропустил что-то простое, что удерживает эту переменную таблицы вне области видимости при обращении из тела курсора?

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
почему вы используете курсор для этого? И почему вы используете @@ identity, когда вы должны использовать OUTPUT или scope_identity () (@@ Identity может вызвать серьезные проблемы с целостностью данных и не должна использоваться таким образом) HLGEM
что я мог использовать, кроме курсора? Потому что я не просто выполняю одну грубую операцию, которая может быть выполнена в 2 строки, чтобы заменить этот итерационный цикл. Совет? PositiveGuy
@CoffeeAddict - точно не знаю, что делает ваш код. В нем есть переменные таблицы, которые ни для чего не используются, поэтому я предполагаю, что он еще не завершен? Если вы используете SQL Server 2008/2012, вы можете посмотреть наMERGE сделать свой "если не существует" логика на основе набора, а не строка за строкой. Вы можете использоватьOUTPUT предложение для получения сведений о вставленных строках (возможно, в табличную переменную). КСТАТИ.SELECT COUNT(BusinessLine) всегда будет возвращать ровно одну строку, такDISTINCT там избыточно. Martin Smith
сейчас я использую курсор, потому что я не знаю T-SQL для дыры в земле для итерации циклов. Я исправлю это к лучшему после того, как получу работу. Дерьмо, да, это было давно, забыли о scope_identity PositiveGuy

Ваш Ответ

1   ответ
52

Этодавняя проблема парсера, Вам нужно избавиться от префикса таблицы или заключить его в квадратные скобки.

то есть

delete from @CompanyGroupSites_Master 
where CompanyGroupID = @CompanyGroupID

или же

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

Not

delete from @CompanyGroupSites_Master 
where @CompanyGroupSites_Master.CompanyGroupID = @CompanyGroupID
Спасибо! Последние несколько часов я рвал себе на голову, пытаясь понять, почему SQL считает мою переменную таблицы необъявленной!
Дух Макфлай. Благодарю. Я на самом деле не владелец T-SQL, а более опытный специалист по ООП. PositiveGuy

Похожие вопросы