更新表格';s新添加的列与SQL Server中的匹配记录

更新表格';s新添加的列与SQL Server中的匹配记录,sql,sql-server,database,Sql,Sql Server,Database,我最近在我的发票表中添加了一个新的外键约束(ProjectID),我正在尝试更新发票表,以便外键与给定的一组记录匹配 使用下面的查询,我能够找到匹配的记录 SELECT IV.InvoiceID, TA.ProjectID FROM Invoices IV JOIN TimeEntries TE on TE.InvoiceId = IV.InvoiceID JOIN Tasks TA ON TE.TaskID = TA.TaskID 我认为正确的方法是

我最近在我的
发票
表中添加了一个新的外键约束(
ProjectID
),我正在尝试更新
发票
表,以便外键与给定的一组记录匹配

使用下面的查询,我能够找到匹配的记录

SELECT 
    IV.InvoiceID, TA.ProjectID 
FROM 
    Invoices IV
JOIN 
    TimeEntries TE on TE.InvoiceId = IV.InvoiceID
JOIN 
    Tasks TA ON TE.TaskID = TA.TaskID
我认为正确的方法是使用游标并遍历
Tasks
表中的所有记录,但我不确定如何继续

这就是我到目前为止所做的:

DECLARE @ForeignKey int

DECLARE C CURSOR FOR SELECT IV.InvoiceID, TA.ProjectID FROM Invoices IV
JOIN TimeEntries TE on TE.InvoiceId = IV.InvoiceID
JOIN Tasks TA ON TE.TaskID = TA.TaskID

OPEN C

FETCH NEXT FROM C INTO @ForeignKey

WHILE @@FETCH_STATUS = 0
BEGIN
    UPDATE Invoices
    SET ProjectID = @ForeignKey
    WHERE InvoiceID = ??? (Need matching ID)

提前谢谢

此操作不需要光标:

UPDATE IV
    SET ProjectId = TA.ProjectID 
    FROM Invoices IV JOIN
         TimeEntries TE 
         ON TE.InvoiceId = IV.InvoiceID JOIN
         Tasks TA ON TE.TaskID = TA.TaskID;

您不需要光标:

UPDATE IV
    SET ProjectId = TA.ProjectID 
    FROM Invoices IV JOIN
         TimeEntries TE 
         ON TE.InvoiceId = IV.InvoiceID JOIN
         Tasks TA ON TE.TaskID = TA.TaskID;
您永远不应该认为,“游标可能是实现这一点的最佳方式。”SQL Server是为处理数据集而构建的,而不是对数据进行迭代。游标是对不断要求它们的程序员的让步,它解决了一些由于SQL实现的进步而不再是问题的问题,并且处理了极少数不可能使用基于集合的方法的情况。您永远不要认为,“游标可能是最好的方法。”SQL Server是为处理数据集而构建的,而不是遍历数据。游标是程序员不断要求它们的让步,它解决了一些由于SQL实现的进步而不再是问题的问题,并且处理了极少数无法使用基于集合的方法的情况。