我有两个表: WebPages (包括父网站ID)和结果(包括父网页ID)。
我想编写一个存储过程,为所有具有特定网站ID 的记录更新“ FirstSeen ”列。
例如(此代码不起作用):
CREATE PROCEDURE [dbo].[MySP]
@SiteId int
AS
BEGIN
SET NOCOUNT ON;
UPDATE [dbo].[Results]
SET [dbo].[Results].[FirstSeen] = GetDate()
WHERE [dbo].[WebPages].[Id] = [dbo].[Results].[WebPages_Id] AND [dbo].[WebPages].[WebSites_Id]=@SiteId
END
GO
我收到了这些错误:
Msg 4104, Level 16, State 1, Procedure MarkAllResultsAsReaded, Line 10
The multi-part identifier "dbo.WebPages.Id" could not be bound.
Msg 4104, Level 16, State 1, Procedure MarkAllResultsAsReaded, Line 10
The multi-part identifier "dbo.WebPages.WebSites_Id" could not be bound.
你知道如何解决这个问题吗?
我正在使用SQL-Server 2008。
答案 0 :(得分:2)
如果没有明确地在连接中使用,则不能在更新中使用当前表以外的表,如下所示:
UPDATE r
SET r.[FirstSeen] = GetDate()
FROM [dbo].[Results] r
INNER JOIN [dbo].[WebPages] p ON p.[Id] = r.[WebPages_Id]
WHERE p.[WebSites_Id]=@SiteId
您需要加入的原因是您的UPDATE
引用了两个表格 - Results
和WebPages
。
答案 1 :(得分:1)
您想要加入这两个表并执行UPDATE,如下所示,因为您实际上正在尝试更新Results
表中webpages
表中存在匹配记录的所有行。
UPDATE r
SET [FirstSeen] = GetDate()
FROM [dbo].[Results] r
JOIN [dbo].[WebPages] w
ON w.[Id] = r.[WebPages_Id]
AND w.[WebSites_Id]=@SiteId
答案 2 :(得分:0)
你做一个子查询:
UPDATE [dbo].[Results]
SET [dbo].[Results].[FirstSeen] = GetDate()
WHERE [Results].[WebPages_Id] IN (Select [WebPages].[Id] From [dbo].[WebPages]Where [WebPages].[WebSites_Id]=@SiteId)
JOIN
会为您提供更好的效果,如其他答案所示。