sp_executesql在存储过程中插入时返回id

时间:2015-08-13 21:32:17

标签: sql sql-server-2008

我创建了一个动态存储过程,用于更新,插入和删除特定的表:

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 '+@TableName+' SET '+@UpdateQuery+' WHERE ('+@Where+')';
  ELSE IF(@Action = 'INSERT')
  SET @SQLString = 'INSERT INTO '+@TableName+' '+@InsertQuery + ';
  ELSE IF(@Action = 'DELETE')
  SET @SQLString = 'DELETE FROM '+@TableName+' WHERE ('+@Where+')';

EXECUTE sys.sp_executesql @SQLString

END

问题是,我尝试添加到此代码SELECT SCOPE_IDENTITY()以获取插入的新行ID,输出中得到-1。 我所做的改变是:

@SQLString = 'INSERT INTO '+@TableName+' '+@InsertQuery + '; SELECT SCOPE_IDENTITY()';

为了实现这一目标,我需要做些什么改变?

1 个答案:

答案 0 :(得分:1)

没关系,你不应该使用scope_identity。你有更多的现代结构,比如:

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

您可以在表格中输出结果(单个插入不需要)或使用上面的简单表格,并使update语句充当select并返回值。