现有两个表: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. 【英语】Bingo口语笔记(76) - 不知如何应答的场景对话

  2. 【NYOJ-187】快速查找素数—— 枚举法、筛选法、打表法

    快速查找素数 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 现在给你一个正整数N,要你快速的找出在2.....N这些数里面所有的素数. 输入 给出一个正整数数N(N ...

  3. ios import和@class的区别

    二者的区别在于: 1.import会包含这个类的所有信息,包括实体变量和方法,而@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,暂时不用考虑,后面会再告诉你. 2.在头 ...

  4. slidingMenu默认显示菜单

    关键词:slidingmenu 默认 显示 打开 菜单 showMenu toggle 问题:要在Activity一打开就显示slidingmenu. 解决: 搜索“slidingmenu 默认打开” ...

  5. mybatis Java API

    既然你已经知道如何配置 MyBatis 和创建映射文件,你就已经准备好来提升技能了. MyBatis 的 Java API 就是你收获你所做的努力的地方.正如你即将看到的,和 JDBC 相比, MyB ...

  6. delphi 中字符串与16进制、10进制转换函数

      //字符串转成16进制代码function strToHexStr(str:string):string;varc:char;ss:string;i:integer;beginwhile str& ...

  7. nginx 负载均衡相关知识

    Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 Igor Sysoev ...

  8. Drupal如何SQL查询传递参数?

    Drupal使用称之为“placeholder”的方式处理SQL查询参数: <?php // WRONG: $result = db_query("SELECT nid, title ...

  9. hdu 5253 最小生成树

    赤裸裸最小生成树,没啥说的,我用kruskal过的 /* * Author : ben */ #include <cstdio> #include <cstdlib> #inc ...

  10. selenium python (一) 开发环境搭建

    1.工具下载: python工具共包括三个:python.setuptools.pip ²  python:http://python.org/getit/     python开发环境: ²  se ...