Процедура вставки SQL - PullRequest
0 голосов
/ 05 августа 2009

Почему моя процедура вставки не возвращает идентификатор недавно вставленной строки? И, при вызове этой процедуры, почему я должен предоставлять значение для @EventId? Этот столбец является ПК с ИДЕНТИЧНОСТЬЮ.

IF OBJECT_ID ( 'vjsql.EventsINSERT', 'P') IS NOT NULL
    DROP PROCEDURE EventsINSERT 
GO
CREATE PROCEDURE EventsINSERT
    @EventId         int     OUTPUT,
    @EventDate         datetime,
    @Title       varchar(100),
    @IsActive        bit
AS
BEGIN
    INSERT INTO EventCalendar ( EventDate, Title, IsActive)
    VALUES ( @EventDate, @Title, @IsActive)
    SELECT @EventId = SCOPE_IDENTITY()
END

Ответы [ 5 ]

3 голосов
/ 05 августа 2009

Как вы звоните в хранимую процедуру?

Этот SP возвращает значение EventID посредством использования параметров OUTPUT.
в терминах программирования это процедура (а не функция), которая принимает параметр OUTPUT, который будет установлен со значением во время выполнения хранимой процедуры.

Для этого вам нужно будет передать переменную для @EventID. Значение которого будет установлено в процедуре, и вы сможете прочитать его после завершения процедуры.

См. Пример кода ниже.

DECLARE @NewEventID INT

EXEC EventsINSERT
  @EventId = @NewEventID OUTPUT,
  @EventDate = '08/04/09',
  @Title     = 'Hello World',
  @IsActive  = 0

SELECT @NewEventID 
1 голос
/ 05 августа 2009

Вам не нужно указывать значение для параметра OUTPUT, вам нужно указать, в какую локальную переменную выводятся выходные данные:

По умолчанию SQL Management Studio называет параметр и переменную одинаковыми, что может привести к путанице. Вот пример вашего SP, который называется:

DECLARE @InsertedEventId int

EXEC    [dbo].[EventsINSERT]
        @EventId = @InsertedEventId OUTPUT,
        @EventDate = N'2009-08-05',
        @Title = N'Some event',
        @IsActive = 1

-- Display ID as result set
SELECT @InsertedEventId

Просто чтобы уточнить: ваша хранимая процедура в порядке. Я использовал его как есть.

1 голос
/ 05 августа 2009

Попробуйте добавить некоторые терминаторы операторов:

BEGIN
INSERT INTO EventCalendar ( EventDate, Title, IsActive)
VALUES ( @EventDate, @Title, @IsActive);

SELECT @EventId = SCOPE_IDENTITY();
END

И, при вызове этой процедуры, почему я должен предоставлять значение для @EventId? Этот столбец является ПК с ИДЕНТИЧНОСТЬЮ.

Нет, но вам нужно предоставить переменную типа int (или совместимую с int) для выходного значения, которое будет помещено.

0 голосов
/ 05 августа 2009

Почему не моя процедура вставки возврат идентификатора недавно вставленного строка

Ваш код должен работать. Попробуй в консоли вместо

SELECT @EventId = SCOPE_IDENTITY()

делает

SELECT SCOPE_IDENTITY()

и посмотрите, что получится. Возможно, что вы называете это неправильно. Вам следует сохранить значение переменной OUTPUT в переменной в области, в которой вы вызываете этот SP.

при вызове этой процедуры, почему я должны предоставить значение для @EventId?

Потому что вы должны указать значение для каждого имеющегося у вас параметра. Не имеет значения, является ли это реальным значением, оно будет отброшено, но вы должны вызвать хранимую процедуру с переменной в этом параметре, чтобы перехватить возвращаемое значение.

0 голосов
/ 05 августа 2009

Я довольно ржавый с tsql, но разве вам не нужно явно выбирать @@ identity, чтобы получить этот идентификатор строки? Вот где я бы начал копать, так как я думаю, что scope_identity () может не возвращать значение в контексте пользовательской функции / процедуры.

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