2017-02-16 74 views
0

試圖插入到其他兩個表表一環SQL服務器:錯誤「必須聲明標量變量」

DECLARE @RowCount INT 
SET @RowCount = (SELECT Max(FogTopicsID) FROM FSB_FogTopics) 

DECLARE @I INT 

SET @I = 1 

WHILE (@I <= @RowCount) 
BEGIN 
    DECLARE @FogID INT, @StudentID INT, @TopicID INT, @ProcessStudentId INT 

    SELECT @FogID = FogID, @StudentID = StudentID, @TopicID = TopicsID 
    FROM FSB_FogTopics 
    WHERE FogTopicsID = @I 

    SELECT @ProcessStudentId = ProStudentId 
    FROM FSB_ProcessStudents 
    WHERE ProcessId = @FogID AND StudentId = @StudentID 

    INSERT INTO FSB_ProcessTopics([ProcessStudentId], [TopicId]) 
    VALUES (@ProcessStudentId, @TopicID) 

    SET @I = @I + 1 
END 

,但我得到一個錯誤

必須聲明標量變量@ProcessStudentId

+0

您確定設置了該值嗎? – Forklift

+3

你爲什麼首先用循環做這件事?這似乎是一個壞主意.. – Siyual

回答

2

正如叉車評論指出的那樣 - 您可以使用適當的基於集合的解決方案,而不是像這樣的可怕循環;

INSERT FSB_ProcessTopics([ProcessStudentId], [TopicId]) 
SELECT 
    s.ProStudentId, 
    f.TopicsId 
FROM FSB_FogTopics f 
INNER JOIN FSB_ProcessStudents s 
    ON f.FogId = s.ProcessId 
    AND f.StudentId = s.StudentId 

雖然我知道這並不能回答你的問題每說,這是一個更好的辦法來做到這一點,應該不再需要解決您的問題...

你可能有非連續的Ids - 所以你有1,2,4作爲Ids,但你的代碼試圖消除1,2,3,4

2

你不需要循環來做到這一點(你應該幾乎從來沒有需要使用在SQL中爲任何事物循環)。您可以在一個語句做你INSERT

Insert FSB_ProcessTopics 
     (ProcessStudentId, TopicId) 
Select P.ProStudentId, T.TopicsId 
From FSB_FogTopics  T 
Join FSB_ProcessStudents P On P.ProcessId = T.FogId 
           And P.StudentId = T.StudentId 
2

做到這一點作爲一個單獨的語句:

INSERT FSB_ProcessTopics(ProcessStudentId, TopicId) 
    SELECT ProStudentId, TopicsID 
    FROM FSB_FogTopics ft JOIN 
     FSB_ProcessStudents ps 
     ON ft.StudentID = ps.StudentId AND sps.ProcessId = ft.FogiId; 

這應該更換光標,循環,應有盡有。