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;
这将替换光标、循环和所有内容 您确定正在设置该值吗?首先为什么要使用循环执行此操作?这似乎是个坏主意。你确定正在设置值吗?首先为什么要使用循环来执行此操作?这似乎是个坏主意。。