2016-02-11 3 views
1

У меня есть много таблиц с той же общей схеме (что-то) ID TINYINT, (то) Название VARCHAR (50), как это:Getting Возвращаемое значение из динамического SQL Upsert хранимой процедуры

  PhoneType 
    --------------------------- 
    PhoneTypeID | PhoneTypeName 
    --------------------------- 
      1  | Cell Phone 
      2  | Landline 

Я ве написал динамический SQL скрипт, который может сделать upserts на этих таблицах, учитывая ID (обновление, если не 0, вставить в противном случае), значение имени, и имя таблицы:

ALTER PROCEDURE [dbo].[UpsertListItemValue] 
      @ItemID varchar(4), 
      @ItemName varchar(50), 
      @TableName varchar(50) 
AS 

DECLARE @sql nvarchar(500) 

SET @sql = 'IF ' + @ItemID + ' <> 0 
BEGIN 
    UPDATE ' + @TableName + ' 
     SET ' + @TableName + 'Name = ''' + @ItemName + ''' 
    WHERE ' + @TableName + 'ID = ' + @ItemID + ' 
END 
ELSE 
BEGIN 
    INSERT INTO ' + @TableName + ' 
     (' + @TableName + 'Name) 
    VALUES 
     (''' + @ItemName + ''') 
END' 
EXECUTE (@sql) 
GO 

Я хотел бы иметь идентификатор элемент, который был вставлен/обновлен, и используйте это как возвращаемое значение для моей хранимой процедуры. Как мне это сделать?

Например, если я

EXEC UpsertListItemValue 1, 'Celluar Phone', PhoneType 

Я хотел бы получить 1 назад (после обновления), и если я

EXEC UpsertListItemValue 0, 'Work Phone', PhoneType 

Я хотел бы получить 3 назад (после вставки).

ответ

3

Использование SCOPE_IDENTITY в динамическом-SQL сценария, потому что она возвращает значение в той же области.

alter PROCEDURE [dbo].[UpsertListItemValue] 
      @ItemID varchar(4), 
      @ItemName varchar(50), 
      @TableName varchar(50) 
AS 

DECLARE @sql nvarchar(500) 
     , @ret tinyint 

SET @sql = 'IF ' + @ItemID + ' <> 0 
BEGIN 
    UPDATE ' + @TableName + ' 
     SET ' + @TableName + 'Name = ''' + @ItemName + ''' 
    WHERE ' + @TableName + 'ID = ' + @ItemID + ' 
END 
ELSE 
BEGIN 
    INSERT INTO ' + @TableName + ' 
     (' + @TableName + 'Name) 
    VALUES 
     (''' + @ItemName + ''') 
END 

SET @ret = isnull(SCOPE_IDENTITY(), ''' + @ItemID + ''')' 

EXECUTE SP_EXECUTESQL @sql, N'@ret tinyint OUTPUT', @ret = @ret output 

RETURN @ret 
GO 
+0

Именно то, что я искал. Благодаря! –

0

использование SCOPE_IDENTITY чтобы obain значение идентификатора вставляется

+0

Я попытался добавить 'RETURN @ ItemID' и' RETURN SCOPE_IDENTITY() 'в соответствующих блоках, но я получаю сообщение об ошибке говорящее«Оператор RETURN с возвращаемым значением не может быть использована в этом контексте.» –

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