Sql 存储过程仅使用声明的表插入一个表,而不使用其余声明的表插入

Sql 存储过程仅使用声明的表插入一个表,而不使用其余声明的表插入,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我之前发布了这个存储过程,因为解决了一个不同的问题。但我注意到,当我执行存储过程,并给它从其他代码接收的值时,它只是插入测验表,而不是其他两个表、游戏和视频 这是存储过程 CREATE PROCEDURE s_Add$Subject$Info ( @SubjectName varchar(50), @SubjectDescription varchar(max), @QuizIDString varchar(100), @GamesIDString varchar(100), @VideoIDS

我之前发布了这个存储过程,因为解决了一个不同的问题。但我注意到,当我执行存储过程,并给它从其他代码接收的值时,它只是插入测验表,而不是其他两个表、游戏和视频

这是存储过程

CREATE PROCEDURE s_Add$Subject$Info
(
@SubjectName varchar(50),
@SubjectDescription varchar(max),
@QuizIDString varchar(100),
@GamesIDString varchar(100),
@VideoIDString varchar(100)
)
as

--declare variables
declare @theSubID int
declare @quizIDLength int
declare @gamesIDLength int
declare @videoIDLength int
declare @quizIDs varchar(200)
declare @gamesIDs varchar(200)
declare @videoIDs varchar(200)
declare @numberCount int
declare @sTemp varchar(100)

--initializing variables
set @quizIDLength = LEN(@QuizIDString)
set @gamesIDLength = LEN(@GamesIDString)
set @videoIDLength = LEN(@VideoIDString)
set @quizIDs = ''
set @gamesIDs = ''
set @videoIDs = ''
set @numberCount = 1


--declare temp tables
declare @Q table --Quiz 
(
QuizID varchar(100),
SubjectID int
)

declare @G table --Games
(
GamesID varchar(100),
SubjectID int
)

declare @V table --Videos
(
VideoID varchar(100),
SubjectID int
)

insert into[Subjects]
(SubjectName, SubjectDescription)
values
(@SubjectName, @SubjectDescription)
set @TheSubID = @@IDENTITY

--Check to see what strings are full then entering ids if true
--Quizzes first
if(@QuizIDLength > 0)
begin
    while(@numberCount <=@quizIDLength)
    begin
    set @sTemp = SUBSTRING(@QuizIDString, @numberCount, 1)
    if(@sTemp = ',')
    begin 
        insert into @Q (QuizID, SubjectID) values (@quizIDs, @theSubID)
        set @quizIDs = ''
    end
    if(@sTemp <> ',')
    begin
        set @quizIDs = @quizIDs + @sTemp
    end
    set @numberCount = @numberCount + 1
    end
end
--Games second
if(@gamesIDLength > 0)
begin
    while(@numberCount <=@gamesIDLength)
    begin
        set @sTemp = SUBSTRING(@GamesIDString, @numberCount, 1)
        if(@sTemp = ',')
        begin 
            insert into @G (GamesID, SubjectID) values (@gamesIDs, @theSubID)
            set @gamesIDs = ''
        end
        if(@sTemp <> ',')
        begin
            set @gamesIDs = @gamesIDs + @sTemp
        end
        set @numberCount = @numberCount + 1
    end
end
    --Videos third
    if(@videoIDLength > 0)
    begin
        while(@numberCount <=@videoIDLength)
        begin
            set @sTemp = SUBSTRING(@VideoIDString, @numberCount, 1)
            if(@sTemp = ',')
            begin 
                insert into @V (VideoID, SubjectID) values (@videoIDs, @theSubID)
                set @videoIDs = ''
            end
            if(@sTemp <> ',')
            begin
                set @videoIDs = @videoIDs + @sTemp
            end
            set @numberCount = @numberCount + 1
        end
        end
    --inserting the ids to subjectinfo table
    insert into [SubjectInfo]
        (SubjectID, QuizID)
    select SubjectID, QuizID
    from @Q

    --Games
    insert into [SubjectInfo]
        (SubjectID, GameID)
    select SubjectID, GamesID
    from @G

    --Video
    insert into [SubjectInfo]
        (SubjectID, VideoID)
    select SubjectID, VideoID
    from @V
我曾尝试在其各自的if语句中插入insert,甚至尝试使用内部连接一次性插入,但效果并不理想

那么,为什么数据只能使用我声明的表在第一次插入时插入,而不能在其他表上插入呢? 我可以通过使用C/ASP.NET对其进行编码来解决这个问题,但是我必须多次打开连接,我真的不想这样做,因为我已经在编写存储过程来插入我需要的内容,所以我可以在编写过程中在存储过程中处理它


有什么想法或者有人能看到我做错了什么吗?

您可能需要将@numberCount重置为0。另外,请使用SCOPE\u IDENTITY而不是@IDENTITY函数,如果同时调用此进程,它可能会返回错误的结果。@M.Ali,我以前读过这两个问题,并且一直使用@IDENTITY,从未遇到任何问题,这并不意味着它可能不会在某个时刻发生,所以我应该开始考虑使用SeopeIIO标识:您应该明确使用SeopeIO标识而不是@ @标识。为了澄清这个问题,@@IDENTITY是一个全局变量,对所有连接都可见。如果您只有一个到数据库的连接,@@IDENTITY将起作用,但一旦您有多个并发连接,您就有可能让连接A获得通过连接B生成的最后一个标识值。但是;SCOPE_IDENTITY返回的值被私有地限定到连接的作用域,因此每个连接都会看到自己的最后一个标识值。您绝对应该使用范围\标识,而不是@@IDENTITY。@Craig-@@IDENTITY不是全局变量。它从不返回由另一个会话生成的值。区别纯粹在于是否在同一会话中看到调用堆栈上下生成的值。