在存储过程之间调用



我有一个执行insert命令的存储过程tstrongtudent_sp。插入之后,我需要在另一个表中插入相同的详细信息,该表已经编写了不同的存储过程tst_user_sp。当我尝试调用tst_user_sp时,它不起作用。

ALTER PROCEDURE [dbo].[tst_student_sp] 
    @gid nvarchar(64)= null,
    @student_firstname nvarchar(45) =null,
    @student_lastname nvarchar(45) =null,
    @dateof_birth datetime =null,
    @dateof_join datetime =null,
    @case_id integer =null,
    @result int output
AS
    SET NOCOUNT ON;
if @case_id=1
    if @gid != ''
        BEGIN
            insert into tst_student(
            student_gid,
            student_firstname,
            student_lastname,
            dob,
            doj
            )values(
            @gid,
            @student_firstname,
            @student_lastname,
            @dateof_birth,
            @dateof_join)
            set @result=@@rowcount
            if @result=1
                BEGIN
                    EXEC dbo.tst_user_sp '4',@student_firstname,@student_lastname,'vcx102','s',2;                   
                END
        END

第二个存储过程:

ALTER PROCEDURE [dbo].[tst_user_sp]     
    @user_gid nvarchar(64)=null,
    @fname nvarchar(45)=null,
    @lname nvarchar(45)=null,
    @user_id nvarchar(64) = null, 
    @pwd nvarchar(64) = null,   
    @class_gid nvarchar(64)=null,
    @case_id integer=null   
AS
    SET NOCOUNT ON;
IF @case_id=2
BEGIN
    INSERT INTO tst_user (user_gid,user_firstname,user_lastname,user_id,user_pwd,state)
    values (@user_gid,@fname,@lname,@user_id,@pwd,'Active')
    print @@rowcount
END

这部分编码没有执行。该表仍然为空。

set @result=@@rowcount
if @result=1
    BEGIN
        EXEC dbo.tst_user_sp '4',@student_firstname,@student_lastname,'vcx102','s',2;                   
    END

您缺少一个参数,因此@case_id最终成为nullnull不是2,所以没有插入。

如果不希望它们工作,则不要使用默认参数值。约束越多,出现这种错误的可能性就越小。在所有参数中,您似乎不希望缺少任何。因此,请删除这些默认值。

哦,'whatever'varchar常数——对于nvarchar,您希望使用N'whatever'。这里没有太大区别,但它可能会导致您错过索引,以及非本地字符:)

另外,要小心@@rowcount。我不会使用它,除非你需要它(而不是这种情况),并且很清楚它是如何工作的——例如,将它与触发器一起使用非常棘手。即使是简单的set分配也会导致@@rowcount变为1。并且读取@@rowcount会将其重置为0。小心:)

最新更新