2015-08-13 4 views
0

я создал динамическую хранимую процедуру обновление, вставка и удаление из конкретной таблицы:sp_executesql возвращает идентификатор при вставке в хранимой процедуре

CREATE PROCEDURE dbo.Pj_Change 
@Action Varchar(20), 
@TableName Varchar(20), 
@InsertQuery Nvarchar(max), 
@UpdateQuery Nvarchar(max), 
@Where Varchar(50) 

AS 
BEGIN 
    DECLARE @SQLString nvarchar(max); 

    SET NOCOUNT ON 
    IF(@Action = 'UPDATE') 
    SET @SQLString = 'UPDATE '[email protected]+' SET '[email protected]+' WHERE ('[email protected]+')'; 
    ELSE IF(@Action = 'INSERT') 
    SET @SQLString = 'INSERT INTO '[email protected]+' '[email protected] + '; 
    ELSE IF(@Action = 'DELETE') 
    SET @SQLString = 'DELETE FROM '[email protected]+' WHERE ('[email protected]+')'; 

EXECUTE sys.sp_executesql @SQLString 

END 

Проблема заключается в том, чем я пытаюсь добавить к этому коду SELECT SCOPE_IDENTITY(), чтобы получить ID новой строки на вставке, я получаю -1 на выходе. Изменение, что я делаю это:

@SQLString = 'INSERT INTO '[email protected]+' '[email protected] + '; SELECT SCOPE_IDENTITY()'; 

Что мне нужно изменить для этой работы?

ответ

1

Все в порядке, вы не должны использовать scope_identity в любом случае. У вас есть более современные конструкции, как:

update ... set ... output updated.id where ... -- same for insert and delete 

Вы можете выводить результаты в виде таблицы (не требуется для одной вставки) или использовать простую форму, как и выше, и имеет update заявления действует как select и вернуть стоимость.

Смежные вопросы