程序猿利器(二) sql server 存储过程升级脚本自动合并
2015-07-24 23:31
363 查看
整个2014年我大概都在搞一件事情--写报表的存储过程,在开始的时候经常会碰到sql 脚本整理出了问题导致的升级错误,后面我自己总结了一套sql 脚本维护和升级的方法,还算有效吧,最近整理出来方便有这方面需要的朋友看看,改改,用用。
先看看我过去这一年的sql 脚本吧,为了不泄露某些信息,特用程序猿利器(一)中的程序批量将 脚本文件名做了替换。
我的心得:
做好分类是必要的,例如根据公司,报表用途,建立合适的分类文件夹和前缀后缀
必须确保你本地整理的sql 脚本是最新的,每次修改最好从本地的脚本改起,然后你根据修改时间就可以判断出哪些是下次要升级的脚本
大的改动之前先备份相应的脚本
sql 脚本以方便升级形成一个完整的开发模板,这样自动合并后不需要修改就能直接执行
我的sql 脚本大概结构如下,先判断这个存储过程是否存在,有则删除,然后创建,这样可以保证能升级到。然后写好步骤去实现报表
基本代码如下:
可以到附件中下载
先看看我过去这一年的sql 脚本吧,为了不泄露某些信息,特用程序猿利器(一)中的程序批量将 脚本文件名做了替换。
我的心得:
做好分类是必要的,例如根据公司,报表用途,建立合适的分类文件夹和前缀后缀
必须确保你本地整理的sql 脚本是最新的,每次修改最好从本地的脚本改起,然后你根据修改时间就可以判断出哪些是下次要升级的脚本
大的改动之前先备份相应的脚本
sql 脚本以方便升级形成一个完整的开发模板,这样自动合并后不需要修改就能直接执行
我的sql 脚本大概结构如下,先判断这个存储过程是否存在,有则删除,然后创建,这样可以保证能升级到。然后写好步骤去实现报表
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_Rpt_e14e591fcb514834861c5a69810f8f3e]') AND type in (N'P', N'PC')) DROP PROCEDURE [dbo].[usp_Rpt_e14e591fcb514834861c5a69810f8f3e] GO CREATE PROCEDURE usp_Rpt_e14e591fcb514834861c5a69810f8f3e @JMSCustID uniqueidentifier='00000000-0000-0000-0000-000000000000', --加盟商系统有该参数 @ShopID bigint=0, --加盟商系统有该参数 @Year Int, @Month Int, @StockWhere nvarchar(500), @WareHouseWhere nvarchar(500) AS BEGIN DECLARE @SQLString nvarchar(4000); --动态sql字串 --1 条件表 --1.1 产生查询起止日期 ............... --1.3 ............... --1.5 Create table #Temp .......... --2 数据处理 --2.1 期初数据处理
.................. --3 select All select * from #Temp Drop table #Temp END GOsql 脚本编辑完成后保存到相应的文件夹下面,然后你根据修改时间排序就可以获得最近有修改过的脚本了,拷贝出来,放到合并用的文件夹下面,然后重点来了,用自动合并小工具实现脚本合并成一个升级脚本。
基本代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace MakeUpdateScript { class Program { static void Main(string[] args) { string upDateDirectoryName = "Update"; string baseFilePaht = @"K:\";//Environment.CurrentDirectory; if (baseFilePaht == string.Empty) { Console.WriteLine("K盘不存在!"); Console.ReadKey(); return; } //exists the Directory, if not then create string directoryFullPaht = baseFilePaht + @"\" + upDateDirectoryName; if (Directory.Exists(upDateDirectoryName) == false) { Directory.CreateDirectory(directoryFullPaht); } string[] sqlFilesArray = GetFiles(baseFilePaht); if (sqlFilesArray == null || sqlFilesArray.Length == 0) { Console.WriteLine("无法获取到升级的脚本或文件夹!"); Console.ReadKey(); return; } int index =0; string updateFileName = directoryFullPaht + @"\"; string newFileName = string.Empty; string content = string.Empty; StringBuilder saveStr = new StringBuilder(); foreach (var item in sqlFilesArray) { if (index % 10 == 0) { newFileName= updateFileName + (index / 10).ToString() + ".sql"; } content = "--" + item.Replace(baseFilePaht + @"\", "").Split('.')[0] + " " + DateTime.Now.ToShortDateString() +" "+ DateTime.Now.ToShortTimeString() + Environment.NewLine; using (FileStream fs = File.OpenRead(item)) { System.Text.Encoding encode = GetType(fs); content += File.ReadAllText(item, encode) +Environment.NewLine; } saveStr.Append(content); File.Delete(item); if (index % 10 == 9 || index == sqlFilesArray.Length - 1) { File.WriteAllText(newFileName, saveStr.ToString(), Encoding.Default); saveStr.Clear(); } index++; } Console.WriteLine("脚本已经生成!"); Console.ReadKey(); } public static string[] GetFiles(string directoryPaht) { string[] fileNames = Directory.GetFiles(directoryPaht + @"\","*.sql"); //获取该文件夹下面的所有文件名 return fileNames; } /// <summary> /// Get Files Encoding /// </summary> /// <param name="fs"></param> /// <returns></returns> public static System.Text.Encoding GetType(FileStream fs) { BinaryReader r =new BinaryReader(fs,System.Text.Encoding.Default); byte[] ss = r.ReadBytes(4); //编码类型 Coding=编码类型.ASCII; if (ss[0] <=0xEF) { if (ss[0] ==0xEF&& ss[1] ==0xBB&& ss[2] ==0xBF) { return System.Text.Encoding.UTF8; } else if (ss[0] ==0xFE&& ss[1] ==0xFF) { return System.Text.Encoding.BigEndianUnicode; } else if (ss[0] ==0xFF&& ss[1] ==0xFE) { return System.Text.Encoding.Unicode; } else { return System.Text.Encoding.Default; } } else { return System.Text.Encoding.Default; } } } }
可以到附件中下载
相关文章推荐
- 小贝_mysql sql语句优化过程
- 小贝_mysql优化学习
- 开发-数据库-MongoDB初探
- 数据库设计问题解决
- SQL中数据定义语言(DDL)、数据操纵语言(DML)、数据控制语言(DCL)
- MYsql的length的函数 strim
- mysql中文乱码,修改配置为utf-8
- NoSQL 数据建模技术
- Oracle EBS(ERP)行业分工(写给猎头)
- Using MySQL as a NoSQL
- 详解NoSQL数据库使用实例
- Django1.8 更新数据库
- 解决MySQL 一闪而过的情况
- win7下Qt5使用mysql C++编程配置
- 公司MongoDB 实施方案
- 关系数据库理论:范式判断、函数依赖、无损分解、正则覆盖
- 数据库设计的细节说明
- Django+MongoDB
- 数据库设计原则(摘抄)
- 十种NoSQL数据库以及对比