现有两个表: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口语笔记(35) - 常见单词结尾发音

  2. Android 使Volley完美支持自定义证书的Https

    其实在最早的版本里,Volley甚至是不支持https协议的,只能跑http,当然你也可以自己修改他的源码让他支持,如今volley的代码经过一些改进以后, 已经可以完美支持https协议了,无论是在 ...

  3. windows 不能在本地计算机启动apache2 的解决方法(不是修改端口)

    使用命令行运行apache目录下的httpd程序,它会提示哪里出错了,修改即可 D:\Program Files (x86)\Apache2.\bin\httpd

  4. C#实现不安装Oracle客户端访问远程服务器数据!!

    概述: C#通过使用ADO的方式在未安装Oracle数据库的前提下,客户端程序远程访问服务器,会出现:“System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或 ...

  5. C#单例模式的三种写法

    第一种最简单,但没有考虑线程安全,在多线程时可能会出问题,不过俺从没看过出错的现象,表鄙视我…… public class Singleton{    private static Singleton ...

  6. A woman without arms

    任吉美出生在中国烟台海阳一个极为普通的渔民家里.她先天残疾,没有胳膊和手. 小吉美注定要比别人生活得更艰难.她不能自己穿衣,不能自己端碗吃饭,也不能像兄弟姐妹们一样帮助妈妈干家务活,她觉得自己成了家里 ...

  7. php获取上传多个文件缺失

    我们的一个页面编辑发布后台出现了图片无法上传保存的情况,经过调试对比发现,原来是file表单数量过多导致,减少file表单的数量即可上传成功.为了满足需求不减少file表单数并保证上传成功,于是更改了 ...

  8. bzoj 3757 苹果树(树上莫队算法)

    [题意] 有若干个询问,询问路径u,v上的颜色总数,另外有要求a,b,意为将a颜色看作b颜色. [思路] vfk真是神系列233. Quote: 用S(v, u)代表 v到u的路径上的结点的集合. 用 ...

  9. spring依赖注入原理剖析

    PropertyDefinition.java package junit.test; public class PropertyDefinition { private String name; p ...

  10. Connection failed: NT_STATUS_ACCOUNT_RESTRICTION

    今天在linux机器上想要远程重启一台window的机器,输入命令后报错,如下 Google了下,有说是window禁止远程空密码登录,于是到window系统中添加了密码,这下再运行 这下执行就正常了