2017-02-16 4 views
0

Попытка вставить в таблицу из двух других таблиц с петлейSQL Server: Ошибка «Необходимо объявить скалярную переменную»

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 

Хотя я понимаю, что это не отвечает на вопрос, за скажем, что это лучший способ сделать это и устранить необходимость решить проблему ...

Вы, вероятно, не- непрерывные идентификаторы. Значит, у вас есть 1,2,4 в качестве идентификаторов, но ваш код пытается раздеться 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; 

Это должно заменить курсор, петли, все.

Смежные вопросы