获取表中新记录(下一条记录)的主键值的存储过程
在项目中如果数据库表中主键不是使用的自动生成的标识列时
许多表中都需要获取新记录的主键值,每次都需要连接数据库并计算,
所以写了个能适应不同表的存储过程,以及可定义主键前缀及默认长度
许多表中都需要获取新记录的主键值,每次都需要连接数据库并计算,
所以写了个能适应不同表的存储过程,以及可定义主键前缀及默认长度
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
/*
获得表中新的主键值
调用方法:
DECLARE @NewId VARCHAR(20)
EXEC GetNewID 'Customer','CustId','C', 4, @NewId OUT
SELECT @NewId
输入参数:
@TableName 表名
@KeyName 主键名
@Prefix 主键前缀
@Length 表中无数据时的默认长度
输出参数:
@NewId 返回的新主键值
*/
ALTER PROCEDURE GetNewID
(
@TableName NVARCHAR(100),
@KeyName NVARCHAR(100),
@Prefix NVARCHAR(10),
@Length INT,
@NewId NVARCHAR(20) OUT
)
AS
BEGIN
SET NOCOUNT ON
DECLARE @MaxId VARCHAR(20)
DECLARE @Fill NVARCHAR(20)
--DECLARE @NewId VARCHAR(20)
DECLARE @SQL NVARCHAR(1000)
IF ((@Prefix IS NULL))
SET @Prefix = ''
SET @Fill = '00000000000000000000'
SET @SQL = N'SELECT @MaxId = ISNULL(RTRIM(LTRIM(MAX(' + @KeyName + '))), ''' + LEFT(@Prefix + @Fill, @Length) + ''') FROM [' + @TableName + ']'
EXEC sp_executesql @SQL,N'@MaxId VARCHAR(20) OUT',@MaxId OUT
--PRINT 'OUT:'+@MaxId
SET @NewId = @Prefix + RIGHT(@Fill + CAST( (RIGHT(@MaxId,LEN(@MaxId)-LEN(@Prefix))+1) AS NVARCHAR ), LEN(@MaxId)-LEN(@Prefix))
--SELECT @NewId
SET NOCOUNT OFF
END
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
GO
SET ANSI_NULLS ON
GO
/*
获得表中新的主键值
调用方法:
DECLARE @NewId VARCHAR(20)
EXEC GetNewID 'Customer','CustId','C', 4, @NewId OUT
SELECT @NewId
输入参数:
@TableName 表名
@KeyName 主键名
@Prefix 主键前缀
@Length 表中无数据时的默认长度
输出参数:
@NewId 返回的新主键值
*/
ALTER PROCEDURE GetNewID
(
@TableName NVARCHAR(100),
@KeyName NVARCHAR(100),
@Prefix NVARCHAR(10),
@Length INT,
@NewId NVARCHAR(20) OUT
)
AS
BEGIN
SET NOCOUNT ON
DECLARE @MaxId VARCHAR(20)
DECLARE @Fill NVARCHAR(20)
--DECLARE @NewId VARCHAR(20)
DECLARE @SQL NVARCHAR(1000)
IF ((@Prefix IS NULL))
SET @Prefix = ''
SET @Fill = '00000000000000000000'
SET @SQL = N'SELECT @MaxId = ISNULL(RTRIM(LTRIM(MAX(' + @KeyName + '))), ''' + LEFT(@Prefix + @Fill, @Length) + ''') FROM [' + @TableName + ']'
EXEC sp_executesql @SQL,N'@MaxId VARCHAR(20) OUT',@MaxId OUT
--PRINT 'OUT:'+@MaxId
SET @NewId = @Prefix + RIGHT(@Fill + CAST( (RIGHT(@MaxId,LEN(@MaxId)-LEN(@Prefix))+1) AS NVARCHAR ), LEN(@MaxId)-LEN(@Prefix))
--SELECT @NewId
SET NOCOUNT OFF
END
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端