现有两个表:Code和CodeCategory

Code表:

CodeCategory表:

现要把Code表中的数据如实维护一份数据,但是要设PlantID字段值为2,而ID要按规则自增并且要与PlantID=1的数据ID 留出一段空间以防以后增添,摸索半天想到如下办法:

/*
基础数据维护sql脚本
根据CodeCategory表中的数据维护Code表中的多工厂数据
*/
BEGIN TRANSACTION
BEGIN
-- 声明变量
DECLARE @CodeCategoryCount INT;--CodeCategory的数量
DECLARE @Loop INT; -- 循环标记变量
DECLARE @PlantID INT;
DECLARE @ReservedSpace INT; -- 新插入的数据ID与原有PlantID为1的ID的预留空间
DECLARE @OldID VARCHAR(10);
DECLARE @CurrentID VARCHAR(10);
DECLARE @RESULTID VARCHAR(10); -- 获取实际要插入的ID
DECLARE @Flag VARCHAR(10); --用于标记ID值的前两位是否改变
DECLARE @PlusCount int; -- 每次循环的增加量
SELECT @CodeCategoryCount=COUNT(*) from [TEST].[dbo].[Code] WHERE PlantID=1;

-- 在当前库创建一张新表用于存储PlantID=2的所有数据,创建前先检查该表是否存在,如果存在则先要删除,否则会出错
IF EXISTS (SELECT table_name FROM INFORMATION_SCHEMA.TABLES
WHERE table_name = 'CodeHelp')
DROP TABLE CodeHelp
USE [TEST]
CREATE TABLE [dbo].[CodeHelp](
[ID] [varchar](10) NOT NULL,
[Name] [nvarchar](100) NOT NULL,
[CodeCategoryID] [varchar](50) NOT NULL,
[Order] [int] NOT NULL,
[Extend] [varchar](100) NULL,
[IssueTypes] [varchar](100) NULL,
[Comment] [nvarchar](500) NOT NULL,
[IsValid] [bit] NOT NULL,
[PlantID] [int] NULL,
)

SET @Loop=1;
SET @PlusCount=0;
WHILE @Loop < @CodeCategoryCount
BEGIN
SET @PlantID=1;
SET @ReservedSpace=30;-- 预留30个自然数的空间
-- 查出Code表里所有PlantID=1的ID值,用以计算PlantID=2的ID值
SELECT @OldID=ID FROM (select *,ROW_NUMBER()over(order by ID) nb from [TEST].[dbo].[Code] WHERE PlantID=@PlantID)TB
WHERE nb=@Loop
IF SUBSTRING(@OldID,1,2)!=SUBSTRING(@Flag,1,2)
BEGIN
-- 如果ID值的前两位不同则将增加量重新调整为0
SET @PlusCount=0;
END
SELECT @CurrentID=CAST(SUBSTRING(CAST(max(ID)AS VARCHAR(10)),1,2) AS VARCHAR(10))+CAST((SUBSTRING(CAST(max(ID) AS VARCHAR(10)),3,LEN(MAX(ID))-2)+@ReservedSpace) AS VARCHAR(10)) FROM [TEST].[dbo].[Code] WHERE ID like CAST(SUBSTRING(@OldID,1,2) as varchar(10))+'%'
SET @Flag = @OldID;
-- 在PlantID=1的ID值的基础上计算出PlantID=2的初始值(即由PlantID=1的最大ID值加上预留空间,得出)
-- 由以上两ID值和循环索引,得出可插入的ID值
SELECT @RESULTID=CAST(SUBSTRING(@CurrentID,1,2) AS VARCHAR(10))+CAST((SUBSTRING(@CurrentID,3,LEN(@CurrentID)-2)+@PlusCount)AS VARCHAR(10))
--先将数据保存到新建的辅助表
INSERT INTO [TEST].[dbo].[CodeHelp]
-- 查询出要插入的单条数据
SELECT @RESULTID AS ID,Name,CodeCategoryID,[Order],Extend,IssueTypes,Comment,IsValid,PlantID=2 FROM (
select *,ROW_NUMBER()over(order by ID) nb
from [TEST].[dbo].[Code] WHERE PlantID=@PlantID)TB
WHERE nb=@Loop

/*查询以确认ID值是否正确*/
--select @OldID AS OldID,@CurrentID AS CURID,@Loop as loops,@RESULTID AS RESULT,@PlusCount as '增加量'

SET @Loop=@Loop+1
SET @PlusCount=@PlusCount+1
END

--将保存在辅助表中的数据插入到Code表中
INSERT INTO [TEST].[dbo].[Code] SELECT * FROM [TEST].[dbo].[CodeHelp]

--删除辅助表
DROP TABLE [TEST].[dbo].[CodeHelp]

END

IF @@ERROR>0
BEGIN
RAISERROR('出错了',16,1)
ROLLBACK TRANSACTION
RETURN
END
COMMIT TRANSACTION

至此,这个事情算是解决了吧,好累!

SqlServer数据维护的更多相关文章

  1. Oracle、MySql、SQLServer数据分页查询

    看过此博文后Oracle.MySql.SQLServer 数据分页查询,在根据公司的RegionRes表格做出了 SQLserver的分页查询语句: 别名.字段 FROM( SELECT row_nu ...

  2. BSA基础数据维护

    平台 BSA基础数据维护 .扇区五个字段的内容 本来值为0,经过107上计算解析,得出正常的数值.然后106上报(200050),得到回复(200051). 查看回复数据,是否有错误.比如提示104 ...

  3. BDC、CATT批量数据维护

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  4. 《转》SQL Server 2008 数据维护实务

    SQL Server 2008 数据维护实务 http://blog.csdn.net/os005/article/details/7739553 http://www.cnblogs.com/xun ...

  5. python selenium中Excel数据维护(二)

    接着python里面的xlrd模块详解(一)中我们我们来举一个实例: 我们来举一个从Excel中读取账号和密码的例子并调用: ♦1.制作Excel我们要对以上输入的用户名和密码进行参数化,使得这些数据 ...

  6. pandas读取MySql/SqlServer数据 (转)

    在 Anacondas环境中,conda install pymssql ,一直报包冲突,所以采用先在 https://www.lfd.uci.edu/~gohlke/pythonlibs/#nump ...

  7. SD从零开始51-54 信用控制范围, 信用范围数据维护, 自动信用控制, 信用控制-阻止后续功能

    [原创] SD从零开始51 信用控制范围 分散的组织结构Decentralized Organization 信用控制范围是一个为客户指定和控制信用限额的组织单元: 依赖于你公司的需求,应收款可以使用 ...

  8. SQLSERVER数据导入到MYSQL

    SQLSERVER数据导入到MYSQL http://hi.baidu.com/luck001221/item/cb4462299f9ea79ab73263d2?qq-pf-to=pcqq.group ...

  9. Greeplum 系列(八) 数据维护

    Greeplum 系列(八) 数据维护 一.事务管理 begin(start transaction) # 开始事务 savepoint # 保存事务回滚点 rollback # 回滚事务 end(c ...

随机推荐

  1. 【网络】TCP三次握手

    在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接.第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认:第二次握手: ...

  2. log4net使用介绍

    log4net是一款开源的日志工具,现已挂在apache基金会下.非常简单灵活,初学者有时会发现log4参照资料配置好,但并不输出日志.这种情况,一般是没有准确定位到配置文件.可参阅第3步. 下载 下 ...

  3. Java之路

    Java程序员 高级特性 反射.泛型.注释符.自动装箱和拆箱.枚举类.可变参数.可变返回类型.增强循环.静态导入 核心编程 IO.多线程.实体类.集合类.正则表达式.XML和属性文件 图形编程 AWT ...

  4. IOS设计模式之二(门面模式,装饰器模式)

    本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq) ...

  5. 【转】linux驱动程序中的并发控制

    原文网址:http://www.cnblogs.com/geneil/archive/2011/12/03/2274684.html 现代操作系统有三大特性:中断处理.多任务处理和多处理器.这些特性导 ...

  6. Image.FromFile 方法锁住文件解决方法

    Image.FromFile  一旦使用后,对应的文件在一直调用 其生成的Image对象被Disponse前都不会被解除锁定,这就造成了一个问题,就是在这个图形被解锁前无法对图像进行操作(比如删除,修 ...

  7. [转]Linux的tail 与head 命令

    转自:http://blog.csdn.net/carolzhang8406/article/details/6112707 head命令是用来查看具体文件的前面几行的内容,具体格式如下: head ...

  8. 【转】loadrunner检查点设置

    转自:http://www.cnblogs.com/fnng/archive/2013/03/10/2953257.html 判断脚本是否执行成功是根据服务器返回的状态来确定的,如果服务器返回的HTT ...

  9. linux 为开机菜单加密码·

    首先是在/boot/grub/menu.lst 里面添加密码的,但是需要是加密过后的,否则人家直接跑到你的menu.lst里面查看密码不就行了.... 于是,可以使用grub提供的md5加密功能: # ...

  10. Apriori算法例子

    1 Apriori介绍 Apriori算法使用频繁项集的先验知识,使用一种称作逐层搜索的迭代方法,k项集用于探索(k+1)项集.首先,通过扫描事务(交易)记录,找出所有的频繁1项集,该集合记做L1,然 ...