Create PROCEDURE [dbo].[SP_UpdateIdentityId]
(
@tableName NVARCHAR(100) ,
@beforeId INT ,
@afterId INT
)
AS
BEGIN
IF @beforeId IS NULL
OR @afterId IS NULL
OR @tableName IS NULL
BEGIN
PRINT 'param is null'
RETURN
END DECLARE @tb_id INT= OBJECT_ID(@tableName)
IF @tb_id IS NULL
BEGIN
PRINT 'table not exist'
RETURN
END DECLARE @identityId NVARCHAR(200) SET @identityId = ( SELECT name
FROM sys.columns
WHERE object_id = @tb_id
AND is_identity = 1
) IF @identityId IS NULL
BEGIN
PRINT 'table not exist identity column'
RETURN
END DECLARE @columns NVARCHAR(MAX)
SET @columns = ( SELECT ',' + name
FROM sys.columns
WHERE object_id = @tb_id
AND is_identity = 0
FOR
XML PATH('')
)
SET @columns = STUFF(@columns, 1, 1, '') --PRINT @columns DECLARE @sql NVARCHAR(MAX) SET @sql = 'SELECT *
INTO #tmp_update_identity
FROM ' + @tableName + '
WHERE ' + @identityId + ' = @beforeId if not exists(select 1 from #tmp_update_identity)
begin
print ''beforeId row data not exist''
return
end if exists(select 1 from ' + @tableName + ' WHERE ' + @identityId
+ ' = @afterId)
begin
print ''afterId row data already exist''
return
end ALTER TABLE #tmp_update_identity DROP COLUMN ' + @identityId + ' begin try
BEGIN TRANSACTION TRANSACTION_SP_UpdateIdentityId;
DELETE FROM ' + @tableName + ' WHERE ' + @identityId + ' = @beforeId SET IDENTITY_INSERT ' + @tableName + ' ON INSERT ' + @tableName + '(' + @identityId + ' ,' + @columns + ')
SELECT @afterId,* FROM #tmp_update_identity DROP TABLE #tmp_update_identity
print ''ok''
select 1 [state]
COMMIT TRANSACTION
end try
begin catch
print '' try catch ROLLBACK TRANSACTION''
ROLLBACK TRANSACTION
end catch
'
--PRINT @sql IF EXISTS ( SELECT *
FROM tempdb..sysobjects
WHERE id = OBJECT_ID('tempdb..#tmp_update_identity') )
DROP TABLE #tmp_update_identity EXEC sys.sp_executesql @sql,
N'@tableName NVARCHAR(100) , @beforeId INT , @afterId INT',
@tableName, @beforeId, @afterId IF EXISTS ( SELECT *
FROM tempdb..sysobjects
WHERE id = OBJECT_ID('tempdb..#tmp_update_identity') )
DROP TABLE #tmp_update_identity END

默认限制修改后的Id在数据库中不存在!

sql server 修改表自增列的值的更多相关文章

  1. SQL Server 2012 自动增长列,值跳跃问题(自增增加1000)

    介绍 从 SQL Server 2012 版本开始, 当SQL Server 实例重启之后,表格的自动增长列的值会发生跳跃,而具体的跳跃值的大小是根据增长列的数据类型而定的.如果数据类型是 整型(in ...

  2. SQL Server 2012 自动增长列,值跳跃问题

    介绍 从 SQL Server 2012 版本开始, 当SQL Server 实例重启之后,表格的自动增长列的值会发生跳跃,而具体的跳跃值的大小是根据增长列的数据类型而定的.如果数据类型是 整型(in ...

  3. sql server 获取自增列下一个值或者获取指定表的主键值

    IDENT_CURRENT('TableName')为当前的最大标识值, IDENT_INCR('TableName')为设置的标识值增量, 两者相加即为下一个标识值 如: SELECT IDENT_ ...

  4. 【sql进阶】SQL Server 将某一列的值拼接成字符串

    今天在统计报表的时候有这么一个需求,将一列字符串拼接成一行,然后展示到新的列中. 每一项的服务列表如下: 最终想要的结果是 sql如下: select AuxTypeName + ',' from ( ...

  5. SQL Server 将某一列的值拼接成字符串

    名称 海鲜水产 水果蔬菜 海参 肉禽蛋 牛排 腊味 生鲜食品 将以上一列变成: 生鲜食品,海鲜水产,水果蔬菜,海参,牛排,肉禽蛋,腊味 sql for xml path('')

  6. SQL Server获取自增列下一个Id

    IDENT_CURRENT('TableName')为当前的最大标识值,IDENT_INCR('TableName')为设置的标识值增量, 两者相加即为下一个标识值 SELECT IDENT_CURR ...

  7. sql Server 使某一列的值等于行号

    declare @i INT update 表名 SET [列名]=@i,@i=@i+ WHERE 条件

  8. sql server 将某一列的值拼成一个字符串 赋值到一个字段内

    DECLARE @refCodeitems VARCHAR(800),   SELECT @refCodeitems=ISNULL(@refCodeitems,'')+refCodeitem +'/' ...

  9. SQL Server数据库自增字段正确的插入值的描述

    我们今天主要向大家讲述的是SQL Server数据库之向SQL Server自增字段正确的插入值的实际操作步骤,在一般的情况下,我们不能向 SQL Server 数据库自增字段中插入值,如果非要这么干 ...

随机推荐

  1. 20160125--Spring

    package com.hanqi; import java.util.*; import com.hanqi.User; public class HelloWorld { public Hello ...

  2. Can't load IA 32-bit .dll on a AMD 64-bit platform

    在myeclipse中使用的,tomcat异常:java.lang.UnsatisfiedLinkError: D:\JAVA\ApacheTomcat\bin\tcnative-1.dll: Can ...

  3. mysql存储过程和触发器的应用

    ***********[mysql 存储过程和触发器 -- 别安驹]********************* 1.什么情况下使用存储过程? 完成一些比较麻烦的逻辑,比如多表在mysql端的cpu很空 ...

  4. Windows vista以上模拟Alt Ctrl Delete

    之前客户要求我们能够在windows登陆界面能够用指定账户批量控制机器登陆,然后用windows credentials provider(vista以上,xp需要用Gina)实现了这个功能,这期间遇 ...

  5. hdu 4639 Hehe (dp)

    一道dp题,转移方程不是自己推出来的. 题目的意思是用‘qnmlgb’替换‘hehe’,可以替换也可以不替换,问有多少种情况. 如果结尾不是‘hehe’,那么dp[i]=dp[i-1],如果是是‘he ...

  6. Java Eclipse常规设置

    改变字体大小 eclipse英文版中如何去修改字体及方法?首先打开eclipse中,按下面的方法即可菜单项:window ->preferences -> general -> ap ...

  7. 浅谈C中的指针和数组(三)

    上一个博客我们得到了一个结论: 指针和数组根本就是两个完全不一样的东西.只是它们都可以“以指针形式”或“以下标形式”进行访问.一个是完全的匿名访问,一个是典型的具名+匿名访问.一定要注意的是这个“以X ...

  8. jquery插件anccordion

    (function(){ $.fn.YAccordion=function(options){ var settings={ trigger:'click', speed:300, }; if(opt ...

  9. 解决IE8下VS2005,VS2008一些向导提示脚本错误问题

      Some VS2005 and VS2008 Wizards Pop Up Script Error. Visual C++ team has discovered that after inst ...

  10. mysql错误提示不是英语的解决办法

    mysql提示突然就变成法语了,google了一下,找到了解决方法:打开my.ini文件,找到[mysqld]配置项如下 [mysqld] port explicit_defaults_for_tim ...