【问题标题】:Update Table Variable in SQL Server and getting Must declare the scalar variable在 SQL Server 中更新表变量并获取必须声明标量变量
【发布时间】:2016-10-07 23:45:43
【问题描述】:

如果需要,我可以更改为临时表,但是当我在 sql server 中对表变量执行 UPDATE 时,为什么会出现此错误 我该如何解决,我应该切换到临时表吗?

Must declare the scalar variable "@rpmuserTableVariable".

DECLARE @rpmuserTableVariable TABLE
(
 [usr_id] [varchar](8) NOT NULL,
    [usr_fnm] [varchar](64) NOT NULL,
    [usr_lnm] [varchar](64) NOT NULL,
    [usr_pwd] [varchar](64) NOT NULL,
    [email_id] [varchar](250) NULL,
    [wwid] [varchar](8) NULL,
    [tel] [char](20) NULL,
    [dflt_ste_id] [int] NOT NULL,
    [lst_pwd_chg_dtm] [datetime] NULL,
    [lst_accs_dtm] [datetime] NULL,
    [apprvr_wwid] [varchar](8) NULL,
    [inact_ind] [varchar](1) NOT NULL,
    [cre_usr_id] [varchar](8) NOT NULL,
    [cre_dtm] [datetime] NOT NULL,
    [chg_usr_id] [varchar](8) NULL,
    [chg_dtm] [datetime] NULL,
    [salt] [varchar](20) NULL,
    STATUS [char] (1) NULL 
);

-- All Active Users  
INSERT INTO @rpmuserTableVariable
SELECT *  ,'0'                       
FROM rpm_scrty_rpm_usr WITH(NOLOCK)                                             
WHERE inact_ind = 'N'
-- Internal Users  
UPDATE @rpmuserTableVariable 
SET STATUS = 1 
FROM rpm_scrty_rpm_usr ru WITH(NOLOCK)                      
INNER JOIN rpm_scrty_emp_info ei WITH(NOLOCK)                      
       ON ru.wwid = ei.wwid                    
WHERE ru.inact_ind = 'N'                       
AND ei.inact_ind = 'N'
AND ei.dmn_addr IS NOT NULL   
AND @rpmuserTableVariable.usr_id = ru.usr_id 


select * from @rpmuserTableVariable

我需要使用临时表#tempblah 还是有“技巧”来做到这一点?

另外,我可以批量更新吗我不需要执行 WHILE 循环吗?

【问题讨论】:

  • 你知道错误是哪一行/语句抛出的吗?
  • AND @rpmuserTableVariable.usr_id = ru.usr_id
  • 谢谢。我认为@GordonLinoff 为您找到了解决方案。

标签: sql sql-server sql-update temp-tables table-variable


【解决方案1】:

不需要。您只需要一个表别名。别名不能以@开头:

UPDATE rtv
    SET STATUS = 1 
FROM @rpmuserTableVariable rtv INNER JOIN
     rpm_scrty_rpm_usr ru WITH(NOLOCK)
     ON rtv.usr_id = ru.usr_id INNER JOIN
     rpm_scrty_emp_info ei WITH(NOLOCK)                      
     ON ru.wwid = ei.wwid                    
WHERE ru.inact_ind = 'N' AND                   
      ei.inact_ind = 'N' AND
      ei.dmn_addr IS NOT NULL;

【讨论】:

  • 他可以只处理 sql 解析问题,而不是在它周围添加括号吗? [@rpmuserTableVariable] ?
  • @TomStickel 。 . .我刚刚在最新版本的 SQL Server 中测试了它,它可以工作。我记得几年前尝试过,但没有成功——要么我的记忆关闭了,要么这个功能改变了。无论如何,我更喜欢使用显式的JOIN 而不是WHERE 子句中的条件。另外,我几乎总是使用缩写作为表别名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多