现有两个表: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. AIX 第2章 指令记录

    root@db:/#mount  node       mounted        mounted over    vfs       date        options     ------- ...

  2. Python 字典(Dictionary) get()方法

    描述 Python 字典(Dictionary) get() 函数返回指定键的值,如果值不在字典中返回默认值. 语法 get()方法语法: dict.get(key, default=None) 参数 ...

  3. php5.2转向 PHP 5.3 的 PHP 开发

    PHP 5.3 开始,为了更好的向 PHP 的未来版本(PHP6) 过渡,将未来不再支持的函数标记为 DEPRECATED.在代码中使用这些函数,将毫不留情的在页面中显示警告信息:“使用了过时的函数… ...

  4. 让层遮挡select(ie6下的问题)

    虽然现在很多比较大的网站已经不考虑ie6了,不过这些方法,或者其中原理还是值得记录下来的.所以整理的时候,把这篇文章留下了. <script language="javascript& ...

  5. C++ STL知识点小结

    1.capacity(容量)与size(长度)的区别. size(长度)指容器当前拥有的元素个数. capacity(容量)指容器在必须分配新存储空间之前可以存储的元素总数.

  6. [转]Linux的chattr与lsattr命令详解

    转自:http://www.cnblogs.com/yangxia-test/archive/2013/05/24/3096410.html 这两个命令是用来查看和改变文件.目录属性的,与chmod这 ...

  7. IoC(控制反转)

    在传统的编程中,我们通过内部代码来控制组件之间的关系,但是这种实现方式,容易造成组件之间的高耦合.IoC能够很好地解决这个问题,它将组件间的关系从程序内部上提到外部容器来管理.IoC的核心目标是通过简 ...

  8. 【IDE】SharpDevelop

    SharpDevelop 这个轻型的开发工具支持多种程序语言,包括C#.java以及VB.NET,同时还支持多种语言界面,象任何爱好者开发的工具一样.这个编辑器的界面风格类似于Office XP以及V ...

  9. awk与sed简明教程

    看到大牛写的关于awk和sed的简明教程,写得很好,为了尊重作者,就不全文转载了,这里标记下链接,方便以后查阅. awk简明教程:http://coolshell.cn/articles/9070.h ...

  10. linux 条件变量

    互斥量就是一把锁,在访问数据时能保证同一时间内只有一个线程访问数据,在访问完以后再释放互斥量上的锁. 条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条 ...