MySQL迁移至SQL Server:自增键记录复制的存储过程改写
MySQL到SQL Server存储过程迁移方案
首先纠正一个误解:SQL Server支持临时表,本地临时表以#开头,仅当前会话可见;全局临时表以##开头,所有会话可见。针对你的需求,用本地临时表就能实现和原MySQL代码相同的功能,同时兼容表结构变更的场景。
以下是改写后的SQL Server存储过程代码:
DECLARE @cidx INT; -- 删除已存在的临时表(如果有) IF OBJECT_ID('tempdb..#coretmp1') IS NOT NULL DROP TABLE #coretmp1; -- 创建临时表并插入corebuild中最新的一行(按Idx倒序取第一条) SELECT * INTO #coretmp1 FROM corebuild ORDER BY Idx DESC OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY; -- 获取新的Idx值 SELECT @cidx = Idx + 1 FROM #coretmp1; -- 更新临时表中的Idx和Piece字段 UPDATE #coretmp1 SET Idx = @cidx, Piece = 0; -- 将临时表数据插入corebuild INSERT INTO corebuild SELECT * FROM #coretmp1; -- 删除临时表 DROP TABLE #coretmp1; -- 返回新生成的Idx SELECT @cidx;
关键说明:
- SQL Server中用
SELECT ... INTO #临时表语法可以直接从查询结果创建临时表,和MySQL的Create temporary table ... SELECT逻辑一致,且能自动匹配原表结构,兼容后续表结构变更。 - 替代MySQL的
LIMIT 1,SQL Server用OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY实现取第一条数据(SQL Server 2012及以上版本支持),如果是更低版本,可以用TOP 1:SELECT TOP 1 * INTO #coretmp1 FROM corebuild ORDER BY Idx DESC; - 临时表的存在性检查用
OBJECT_ID('tempdb..#coretmp1') IS NOT NULL,因为临时表存储在tempdb库中。 - 变量声明用
@前缀,这是SQL Server的语法规范。
内容的提问来源于stack exchange,提问作者Roger Irwin
相关产品推荐
相关产品推荐

