sql存储过程无法正常工作(没有受影响的行)

时间:2011-11-28 02:50:18

标签: sql sql-server database stored-procedures rows-affected

尝试让这个存储过程正常工作。

ALTER PROCEDURE [team1].[add_testimonial]
-- Add the parameters for the stored procedure here
@currentTestimonialDate char(10),@currentTestimonialContent varchar(512),@currentTestimonialOriginator varchar(20)
AS
BEGIN
DECLARE
@keyValue int

SET NOCOUNT ON;
--Get the Highest Key Value
SELECT @keyValue=max(TestimonialKey)
FROM Testimonial
--Update the Key by 1
SET @keyValue=@keyValue+1
--Store into table
INSERT INTO Testimonial VALUES (@keyValue, @currentTestimonialDate, @currentTestimonialContent, @currentTestimonialOriginator)

END

但它只是返回

Running [team1].[add_testimonial] ( @currentTestimonialDate = 11/11/10, @currentTestimonialContent = this is a test, @currentTestimonialOriginator = theman ).

No rows affected.
(0 row(s) returned)
@RETURN_VALUE = 0
Finished running [team1].[add_testimonial].

No rows affected. (0 row(s) returned) @RETURN_VALUE = 0 Finished running [team1].[add_testimonial].

没有任何内容添加到数据库中,可能是什么问题?

2 个答案:

答案 0 :(得分:1)

两地可能有问题:

一个。表中没有数据,max(TestimonialKey)返回null,下面是处理它的适当方法。

--Get the Highest Key Value
SELECT @keyValue= ISNULL(MAX(TestimonialKey), 0)
FROM Testimonial
--Update the Key by 1
SET @keyValue=@keyValue+1

湾检查列currentTestimonialDate的数据类型,无论是char还是DateTime类型,如果此字段是表格中的日期时间类型,则将@currentTestimonialDate转换为DateTime在插入表格之前。

此外,检查允许的非空列数,并将数据传递给它们。

如果您没有为所有列传递数据,请尝试指定列名称,如下所示:

--Store into table
INSERT INTO Testimonial(keyValue, currentTestimonialDate, 
                       currentTestimonialContent, currentTestimonialOriginator) 
              VALUES (@keyValue, @currentTestimonialDate, 
                     @currentTestimonialContent, @currentTestimonialOriginator)

编辑:

收到marc_s的评论后:

keyValue设为INT IDENTITY,如果多个用户同时调用它不会出现问题,DBMS将处理它,因此程序中的最终查询可能如下所示:

ALTER PROCEDURE [team1].[add_testimonial]
-- Add the parameters for the stored procedure here
@currentTestimonialDate char(10),
@currentTestimonialContent  varchar(512),@currentTestimonialOriginator varchar(20)
AS
BEGIN

  SET NOCOUNT ON;
  --Store into table
  INSERT INTO Testimonial VALUES (@currentTestimonialDate, 
        @currentTestimonialContent, @currentTestimonialOriginator)

END

答案 1 :(得分:0)

我可以发现两个问题:

SELECT @keyValue=max(TestimonialKey)

应该是

SELECT @keyValue=ISNULL(max(TestimonialKey), 0)

考虑数据库中没有记录的情况

其次,我相信使用NOCOUNT ON,您不会将插入行的计数返回给调用者。因此,在INSERT语句之前添加

SET NOCOUNT OFF