Tsql SQL Server:错误“必须声明标量变量”

Tsql SQL Server:错误“必须声明标量变量”,tsql,sql-server-2014,Tsql,Sql Server 2014,尝试使用循环从其他两个表插入到表中 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 SEL

尝试使用循环从其他两个表插入到表中

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


正如叉车的评论所指出的,您可以使用适当的基于集合的解决方案,而不是像这样可怕的循环

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
虽然我意识到这并不能回答你的问题,但这是一个更好的方法,应该可以消除解决问题的需要


您可能有非连续ID-因此您有1,2,4作为ID,但正如叉车的评论所指出的,您的代码正在尝试dind 1,2,3,4

-您可以使用适当的基于集合的解决方案,而不是像这样可怕的循环

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
虽然我意识到这并不能回答你的问题,但这是一个更好的方法,应该可以消除解决问题的需要


您可能有非连续ID-因此您有1,2,4作为ID,但您的代码试图dind 1,2,3,4

您不需要循环来完成此操作,您几乎不需要在SQL中使用循环来完成任何操作。您可以在一条语句中插入:

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
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;

要做到这一点,不需要循环,几乎不需要在SQL中使用循环。您可以在一条语句中插入:

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
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;

请将此作为一条语句执行:

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
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;

这将替换光标、循环和所有内容

将此作为一条语句执行:

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
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;

这将替换光标、循环和所有内容

您确定正在设置该值吗?首先为什么要使用循环执行此操作?这似乎是个坏主意。你确定正在设置值吗?首先为什么要使用循环来执行此操作?这似乎是个坏主意。。