在做项目的过程中,经常会遇到一种情况,开发和测试过程中,会往业务表中添加很多测试数据,等到项目重新发布时需要删除数据并且让主键重新从1开始,若是表比较少还好办,多起来就不好玩了。昨天就碰到这么个事儿,总共50多张表,弄了个将近半个小时,弄完之后想想有没有更好的办法呢,就去网上搜了一下思路,结合实际情况写了如下的存储过程。
需要说明的几点:
1、数据库比较特殊,系统表和业务表取名不同,系统表如实取名,业务表统一为table...,且在一个为S_ENTITY(实体表)中有注明,所以我只需要从S_ENTITY表中获取以table打开的表进行初始化即可。
2、测试数据库用的SQL Server 2005。
3、存储过程思路:先将业务表的结构复制到临时表,再删除业务表,再将临时表中的结构复制到业务表,最后删除临时表。
4、缺点是:因为复制的临时表,所以原来的业务表中的特殊应用如触发器,索引等都会没有,也就是此操作之后新的业务表什么触发器啊、索引啊等特殊应该都会木有,只有一个基本结构。
以下为实现过程:
1、实体表创建:
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[S_ENTITY]( [S_ID] [int] IDENTITY(1,1) NOT NULL, [ENTITYNAME] [varchar](100) COLLATE Chinese_PRC_CI_AS NULL, [ENTITYDESCRIPT] [varchar](200) COLLATE Chinese_PRC_CI_AS NULL CONSTRAINT [PK_S_ENTITY] PRIMARY KEY CLUSTERED ( [S_ID] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO
2、insert测试数据:
insert into S_ENTITY(ENTITYNAME,ENTITYDESCRIPT) values('table1','测试表1') insert into S_ENTITY(ENTITYNAME,ENTITYDESCRIPT) values('table2','测试表2') insert into S_ENTITY(ENTITYNAME,ENTITYDESCRIPT) values('table3','测试表3')
3、创建存储过程:
-- ============================================= -- Author: <wjl> -- Create date: <2015-5-13> -- Description: <初始化业务表中的数据,包括删除业务表数据并复位主键> -- ============================================= CREATE PROCEDURE [dbo].[initData] AS BEGIN SET NOCOUNT ON; --1、从实体表中获取业务数据表:以table开头 declare @count int;--记录符合条件的表的数量 select @count = count(S_ID) from S_ENTITY where ENTITYNAME like '%table%' print @count; if(@count>0)--说明有符合条件的table begin declare @c int; declare @tableName varchar(100);--表名 declare @tempTableName varchar(100);--临时表名称 declare @PKColumn varchar(50);--主键所在列名称 declare @sql varchar(200);--拼接的SQL语句 set @c = 1; while(@c<=@count)--依次循环各个表 begin --获取表名称 select @tableName = ENTITYNAME from ( select ENTITYNAME,row_number() over(order by S_ID) as fn from S_ENTITY where ENTITYNAME like '%table%') as a where fn=@c; print @tableName; --2、将表结构复制到临时表中 set @tempTableName = '##TEMP_TAB_'+@tableName;--使用全局临时表,使用本地临时表会报“找不到临时表”的错误。 print @tempTableName; --判断临时表是否存在 if exists(select * from tempdb..sysobjects where id=object_id('tempdb..'+@tempTableName+'')) begin print '临时表存在'; set @sql = 'drop table '+@tempTableName+';'--若存在则删除 exec(@sql); end --判断物理表是否存在 if object_id(N''+@tableName+'',N'U') is not null print '物理表存在' else begin print @tableName; print '物理表不存在' set @c=@c+1;--循环数加1,否则会死循环 continue;--不存在跳出当前循环,进行下一个循环 end set @sql = 'SELECT * INTO '+@tempTableName+' FROM '+@tableName+ ' where 1=2';--只复制结构,不复制数据 print @sql; exec(@sql); --3、获取主键所在列: --因为复制结构到临时表时除了主键信息之外,其重要的自增信息也会复制过去,所以只需要设置自增信息即可 --(前提条件是当前表上没有其他的特殊应用,若有其他特殊应用如触发器/索引什么的,都会丢失) SELECT @PKColumn=COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME=@tableName; print @PKColumn; --4、删除原有表 set @sql = 'drop table '+@tableName+';' print @sql; exec(@sql); --5、通过临时表新建原有表 set @sql = 'SELECT * INTO '+@tableName+' FROM '+@tempTableName+' where 1=2;';--新建结构,没有数据 print @sql; exec(@sql); --6、为新表添加主键:因为新建的表有临时表的自增属性,所以不需要添加 set @sql ='alter table '+@tableName+' Add Constraint PK_'+@tableName+' Primary Key ('+@PKColumn+')' print @sql; exec(@sql);--执行SQL --7、删除临时表 set @sql = 'drop table '+@tempTableName+';' print @sql; exec(@sql); set @c=@c+1; end end END
个人观点:
上面这个存储过程用来初始化没有特殊应用的表倒是不错,有特殊应用就不行了。最好的办法还是删除标识列,然后再添加标识列,这样原有特殊应用就都保存下来了。有问题的是:每次添加的列都会在表的最后,若是没有特殊不要求倒是也无所谓,要是有特殊要求标识列必须放在第一列,这个位置问题就是个大难题了,MySql中有before和after用来调节这个,SQL Server图形化界面本身也有插入列的操作,SQL Server脚本的实现方法是:新建临时表用来存储原表结构及数据信息,然后删除原表,再将临时表更名为原表名称,最后为新表添加特殊应用,如触发器。
相关推荐
在这个场景中,我们关注的是如何在SQL Server数据库环境下安装配置Oracle GoldenGate(OGG),并将数据从SQL Server实时同步到Oracle数据库。以下是对整个过程的详细说明: 首先,确保你的SQL Server是企业版,并且...
总之,针对SQL Server无主键表的同步方案,需要结合使用SSIS和自定义脚本,以及可能的外部编程语言辅助,以克服特定数据类型的同步难题。这种方法虽然能有效处理大部分情况,但仍然需要不断优化和完善,特别是在处理...
Sql Server 删除所有表数据语句 Sql Server 是一种关系型数据库管理系统,广泛应用于企业级应用程序中。在实际开发和测试中,我们常常需要删除数据库中的所有表数据,而保持表结构不变。下面我们将介绍如何使用一条...
1. 数据架构设计:数据库初始化通常包括创建表、视图、存储过程、触发器等数据库对象,这可以通过编写T-SQL脚本并在SQL Server中执行来完成。 2. 示例数据填充:为了测试和验证数据库设计,往往需要填充一些示例数据...
在IT领域,特别是数据库管理与开发中,导出SQL Server 2000的表结构是一项常见且重要的任务。这不仅对于数据迁移、备份、分析或文档化数据库结构至关重要,而且也是确保数据完整性和可移植性的关键步骤。下面将详细...
Microsoft SQL Server 2005技术内幕: T-SQ程序设计 中文版本的 第一部分 第二部分地址:http://download.csdn.net/source/2680866
在SQL Server 2008 (包括R2版本)中,有时用户在尝试修改数据表的数据类型或主键设置后,会遇到一个错误提示,表明无法保存所做的更改,导致操作失败。这个问题通常与数据库设计者的一项默认设置有关,即“阻止保存...
sqlserver在有数据情况下修改主键为自增 网上方法都有缺陷 自己写了一个版本,欢迎大家参考,不好用吗,大家都不评价
在SQL Server数据库管理中,有时候我们需要将数据库表中的数据导出为SQL语句,以便于备份、迁移或者在其他环境中重建相同的数据结构和内容。针对这个需求,存在一种名为“SQLServer数据库表中数据导出成SQL语句工具...
本书及其续篇——《Microsoft SQL Server 2005技术内幕:T-SQL程序设计》介绍了SQL Server 2005中高级T-SQL查询、查询优化及编程相关的知识。这两本书侧重于解决实践中的常见问题,并讨论了解决这些问题的方法。它们...
运行环境:.net4.5,原创工具 导出后无需修改sql即可执行导入。 SqlServer转Oracle工具 支持表结构、主键及表数据导出
在SQL Server中,主键是表设计中的核心概念,它用于唯一标识表中的每一行记录。主键的设计和选择对数据库的性能、可维护性和扩展性有着深远影响。本文主要探讨了在MS SQL Server中遇到的主键设计问题及其解决方案。 ...
这个压缩包"sqlserver 导出表及字段说明脚本.rar"包含了一个名为"sqlserver 导出表及字段说明脚本.sql"的文件,这通常是一个用于生成SQL语句的脚本,用于描述数据库中的表结构以及各字段的详细信息。以下是对这个...
10.SQL Server 2014定义表主键、外键.mp4 11.SQL Server 2014新增表记录.mp4 12.SQL Server 2014查询表记录.mp4 13.SQL Server 2014修改表记录.mp4 14.SQL Server 2014删除表记录.mp4 15.SQL Server 2014条件...
Microsoft SQL Server 2005技术内幕:T-SQL查询 pdf 中文版 1 第一部分 第二部分地址:http://download.csdn.net/source/2684248
本文将详细介绍如何使用Navicat工具实现SQL Server表结构到MySQL的同步操作,这对于那些需要在不同数据库系统间进行数据迁移的开发者来说尤其有用。 Navicat是一款强大的数据库管理工具,支持多种数据库类型,包括...
本篇文章将深入解析“SqlServer查看表结构”的方法,以及如何利用SQL语句来获取详细的表结构信息,这对于数据库管理员(DBA)、数据分析师、软件开发者等专业人士来说尤为关键。 ### SQL Server查看表结构的重要性 ...
在数据库管理中,了解如何通过SQL语句查询数据表的主键和所有字段是一项基本而重要的技能。这不仅有助于数据库管理员或开发人员更好地理解数据库结构,还能在进行数据操作、优化查询性能或解决数据完整性问题时提供...
综上所述,通过合理利用 SQL Server 代理及其提供的作业功能,用户可以轻松实现对数据表的定期自动清理,同时结合维护计划功能,还能实现数据备份等其他自动化操作,极大地提高了数据管理的效率和安全性。
2. **数据库结构**:SQL Server与SQLite的表结构可能存在差异,例如字段类型、主键约束、外键约束等。工具需要处理这些差异,确保转换后的SQLite数据库能正确反映原始SQL Server的结构。 3. **数据类型映射**:SQL ...