多部分标识符无法绑定?

时间:2017-03-24 12:49:17

标签: sql sql-server database

我试图在存储过程中使用两个表但是在最后一行上出现此错误 ''多部分标识符T.HireDate无法绑定''

我猜它与表的加入有关,但有点迷失。继承我的代码:

CREATE PROC spPayIncreaseCheck
AS
SELECT T.ID,FName,LName,HireDate,Payrate
FROM Assignment.dbo.Payments pay
join Assignment.dbo.Teachers  T
ON pay.ID = T.ID
UPDATE Assignment.dbo.Payments
SET Payrate = 'High'
where T.HireDate < dateadd(year, -3, GETDATE()) 

3 个答案:

答案 0 :(得分:1)

您正在更新Assignment.dbo.Payments表,并且在WHERE条件中您有t.HireDate但t不是UPDATE语句中使用的别名。 在UPDATE中,您不能使用别名。

另外,请注意SELECT和UPDATE语句在存储过程中完全不相关。目前尚不清楚你是否需要将它们联系起来。

您需要UPDATE FROM来执行基于集合的更新:

UPDATE Assignment.dbo.Payments
SET  Payrate = 'High'
FROM  
SELECT T.ID,FName,LName,HireDate,Payrate
FROM Assignment.dbo.Payments pay
JOIN Assignment.dbo.Teachers  T ON pay.ID = T.ID
WHERE T.HireDate < DATEADD(YEAR, -3, GETDATE())

答案 1 :(得分:1)

您是尝试update,还是尝试select

对于在SQL Server中使用连接的update,这是错误的形式。

正确的形式是这样的:

update pay
set Payrate = 'High'
from Assignment.dbo.Payments pay
  inner join Assignment.dbo.Teachers T
    on pay.ID = T.ID
where T.HireDate < dateadd(year, -3, getdate());

另外,您确定on pay.ID = T.ID是正确的连接子句吗?通常情况下,您会看到类似on pay.TeacherID = T.ID的内容。

答案 2 :(得分:1)

实现此目的的最简单方法是使用exists clause检查付款记录是否与教师记录相符:

    update  Assignment.dbo.Payments
    set     Payrate = 'High'
    where   exists ( select 1
                     from   Assignment.dbo.Teachers
                     where  Payments.ID = Teachers.ID
                            and Teachers.HireDate < dateadd(year, -3, getdate()) )