хранимая процедура sql не работает (строки не затрагиваются) - PullRequest
1 голос
/ 28 ноября 2011

пытается заставить эту хранимую процедуру работать.

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 ).</p> <pre><code>No rows affected. (0 row(s) returned) @RETURN_VALUE = 0 Finished running [team1].[add_testimonial].

ив базу данных ничего не добавлено, в чем может быть проблема?

Ответы [ 2 ]

1 голос
/ 28 ноября 2011

Могут быть проблемы в двух местах:

а. В таблице нет данных, поэтому 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)

EDIT:

После получения комментария от marc_s:

Сделать keyValue как INT IDENTITY. Если несколько пользователей одновременно вызовут его, чтобы это не было проблемой, СУБД справится с этим, поэтому окончательный запрос в процедуре может выглядеть следующим образом:

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
0 голосов
/ 28 ноября 2011

Две проблемы, которые я могу заметить:

SELECT @keyValue=max(TestimonialKey)

должно быть

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

Для учета случая, когда в базе данных нет записей

СекундаЯ считаю, что с NOCOUNT ON вы не вернете счетчику количество вставленных строк.Итак, перед вашим INSERT заявлением добавьте

SET NOCOUNT OFF
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...