我有一个执行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
最终成为null
。null
不是2
,所以没有插入。
如果不希望它们工作,则不要使用默认参数值。约束越多,出现这种错误的可能性就越小。在所有参数中,您似乎不希望缺少任何。因此,请删除这些默认值。
哦,'whatever'
是varchar
常数——对于nvarchar
,您希望使用N'whatever'
。这里没有太大区别,但它可能会导致您错过索引,以及非本地字符:)
另外,要小心@@rowcount
。我不会使用它,除非你需要它(而不是这种情况),并且很清楚它是如何工作的——例如,将它与触发器一起使用非常棘手。即使是简单的set
分配也会导致@@rowcount
变为1
。并且读取@@rowcount
会将其重置为0
。小心:)