在 SQL 服务器中更新 Table 变量并获取 必须声明标量变量
Update Table Variable in SQL Server and getting Must declare the scalar variable
如果需要,我可以更改为临时 table,但是当我对 sql 中的 table 变量执行 UPDATE 时服务器,为什么我会收到此错误
我该如何解决,我应该切换到临时 table 吗?
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
我需要使用临时 table #tempblah 还是需要 "trick" 才能做到这一点?
此外,我可以进行批量更新吗? 我不需要执行 WHILE 循环吗?
不需要。您只需要一个 table 别名。别名不能以 @
:
开头
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;
如果需要,我可以更改为临时 table,但是当我对 sql 中的 table 变量执行 UPDATE 时服务器,为什么我会收到此错误 我该如何解决,我应该切换到临时 table 吗?
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
我需要使用临时 table #tempblah 还是需要 "trick" 才能做到这一点?
此外,我可以进行批量更新吗? 我不需要执行 WHILE 循环吗?
不需要。您只需要一个 table 别名。别名不能以 @
:
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;