【问题标题】:How to fix "Must declare the scalar variable" error when referencing table variable?引用表变量时如何解决“必须声明标量变量”错误?
【发布时间】: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


【解决方案1】:

这是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

【讨论】:

  • duh mcfly。谢谢。我不是真正的 T-SQL 大师,更多的是 OOP 人基本 proc cruds
  • 非常感谢!在过去的几个小时里,我一直在努力理解为什么 SQL 认为我的表变量未声明!
  • 2021 年 SQL Server 2019 仍然存在问题!
猜你喜欢
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-06
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多