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
答案 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;