从表名获取maxid时

时间:2014-01-12 18:32:50

标签: sql-server-2008

Declare @Id bigint  
EXEC procGetMaxNumber @Id output,'employee'  

我收到错误消息

  

将数据类型varchar转换为bigint时出错

当我使用上述参数

执行程序时
 -- =============================================    
    -- Description: <Fetches Max Id for a particular table>    
    -- =============================================    
CREATE PROCEDURE [dbo].[procGetMaxNumber]    
(    
  @Id BIGINT OUTPUT,  
  @TblName nvarchar(50)    

 )    
 AS    
 BEGIN    
 SET NOCOUNT ON;    

 Declare @Query nvarchar(max) = ''  
 set @Query =  'SELECT ' + @Id + ' = isnull(Max(Id),0)+ 1 from '  +   @TblName  
 --print @Query  
 Exec (@Query)  
 END

1 个答案:

答案 0 :(得分:2)

这对我来说非常危险。一旦获得“下一个”Id值,您究竟打算做什么?你知道,在你检索这个值之后,有人可以插入一行并接受它(甚至无法插入行,即使事务回滚也仍然可以接受它),对吧?如果你想保留一个Id值并确保它是你得到的数字,只需运行插入,不要做任何这个max + 1以便稍后插入。

无论如何你不能使用EXEC从动态SQL中检索输出参数,你需要使用sp_executesql

DECLARE @query NVARCHAR(MAX) = N'SELECT @Id = COALESCE(MAX(Id),0)+1
  FROM dbo.' + QUOTENAME(@TblName) + ';';

EXEC sp_executesql @query, N'@Id INT OUTPUT', @Id OUTPUT;