SQL脚本直接生成代码

实体生成工具种类多,核心原理并无多大不同,经常用MSSQL,便收集整理了下适合用的:

 

按自己规范生成:

/**
*
* 功能描述:数据库内直接生成实体
* 用    法:Exec SP_GenMCode 表名或视图名
*
*/
 CREATE PROC SP_GenMCode(@obj SYSNAME)        
--生成表实体 参数为表名  
AS        
BEGIN        
 DECLARE @name VARCHAR(200)      
 ,@nameType VARCHAR(200)      
,@value VARCHAR(200)        
,@reader VARCHAR(MAX)      
 SET NOCOUNT ON        
 IF OBJECT_ID(@obj) IS NULL        
 RETURN 0        
       
 SELECT TOP 1 @value=CAST([value] AS NVARCHAR(200))        
 FROM fn_listextendedProperty (        
 'MS_Description', 'Schema', 'dbo', 'table',@obj , NULL, NULL)        
        
 print'    /// <summary>'        
 print'    /// '+ISNULL(@value,@obj)+'实体类'        
 print'    /// </summary>      
    /// <remarks>此类由SP_GenMCode自动生成,简明用SP_GenCode</remarks>'        
 print'    /// <history>'        
 print'    ///     <date>'+CONVERT(VARCHAR(10),GETDATE(),120)+'</date>'        
 print'    ///     <programmer>'+SUBSTRING(USER_NAME(), CHARINDEX( '\',USER_NAME())+1,50)+'</programmer>'        
 print'    ///     <document></document>'        
 print'    /// </history>'        
 print'    [Serializable]'        
 print'    public partial class '+@obj+':BaseModel<'+@obj+'>'        
 print'    {'        
 PRINT'        #region Vars'        
 PRINT'        #endregion'        
 PRINT''        
 PRINT'        #region Constructs'        
 PRINT''      
 PRINT'        /// <summary>'      
 PRINT'        /// 默认构造'      
 PRINT'        /// </summary>'      
 PRINT'        public '+@obj+'():base("'+DB_NAME()+'","'+@obj+'"){}'        
 PRINT'        #endregion'        
 PRINT''        
 PRINT'        #region Properties'        
 PRINT''          
 IF  OBJECT_ID('tempdb..#tempColumn') IS NOT NULL DROP TABLE #tempColumn        
 select A.[name],dbo.fn_GetType(B.[name])AS nameType,[value]        
 INTO #tempColumn        
 from sys.columns A        
 join dbo.systypes B on B.xtype=A.system_type_id        
 LEFT JOIN fn_listextendedProperty (        
 'MS_Description', 'Schema', 'dbo', 'table',@obj , 'COLUMN', null) C        
 ON  C.[objname]COLLATE Latin1_General_CI_AS=A.[name]        
 where [object_id]=object_id(@obj)        
 ORDER BY Column_id         
 WHILE EXISTS(SELECT  1 FROM #tempColumn)        
 BEGIN          
  SELECT TOP 1 @name=[name]        
  ,@nameType=nameType        
  ,@value=CAST([value] AS NVARCHAR(200))        
  FROM #tempColumn       
      
  print'        #region '+ISNULL(@value,@name)        
  PRINT''        
  print'        private ' +@nameType+' auto'+@name+';'        
        
  print'        /// <summary>'        
  print'        /// Gets or sets '+ISNULL(@value,'The '+@name)        
  print'        /// </summary>'        
  print'        public virtual '+@nameType+' '+@name        
  print'        {'        
  print'            get {    '  
 print'  if(default('+@nameType+')==this.auto'+@name+'){               '  
   print' this.GetValue("'+@name+'",ref this.auto'+@name+');'  
  print'     }   '               
  print'                     return this.auto'+@name+';       
                 }'        
  print'            set {        
                       this.SetValue("'+@name+'", value,ref  this.auto'+@name+') ;'      
 IF columnproperty(object_id(@obj),@name,'isidentity')=1 --是否标识列做为简单主列 生成HashCode      
PRINT'                    this.Id=this.auto'+@name+';'      
print'                  }'        
  print'        }'        
  PRINT'        #endregion'        
  PRINT''        
  DELETE  #tempColumn WHERE [name]=@name        
 END        
 IF  OBJECT_ID('tempdb..#tempColumn') IS NOT NULL         
 DROP TABLE #tempColumn        
 PRINT'        #endregion'        
 PRINT''        
 PRINT'        #region Methods'        
 PRINT''      
      
 --PRINT'        /// <summary>      
 --       ///实现接口ICreateModel内部创建对象值      
 --       ///</summary>      
 --       /// <param name="reader">The reader</param>      
 --       /// <returns>当前实体对象</returns>      
 --       protected override '+@obj+' InternalCreateModel(System.Data.IDataReader reader)      
 --       {      
 --         if (reader != null)      
 --           {      
 --               for (int i = 0; i < reader.FieldCount; i++)      
 --               {      
 --                   if (reader.IsDBNull(i))      
 --                   {      
 --                       continue;      
 --                   }      
 --                   this.ChangedProperties[reader.GetName(i)] = reader.GetValue(i);      
 --               }      
 --           }      
 --           return this;      
                 
 --       }'        
 PRINT'        #endregion'        
 print'    }'             
RETURN 0        
END

 简单版:

CREATE PROC dbo.SP_GenCode(@obj SYSNAME)    
--生成表实体 参数为表名    
AS    
BEGIN    
 DECLARE @name VARCHAR(200) ,@nameType VARCHAR(200),@value VARCHAR(200)    
 SET NOCOUNT ON    
 IF OBJECT_ID(@obj) IS NULL    
 RETURN 0    
 SELECT TOP 1 @value=CAST([value] AS NVARCHAR(200))    
 FROM fn_listextendedProperty (    
 'MS_Description', 'Schema', 'dbo', 'table',@obj , NULL, NULL)    
    
 print'    /// <summary>'    
 print'    /// '+ISNULL(@value,@obj)+'实体'    
 print'    /// </summary>'    
 print'    /// <history>'    
 print'    ///     <date>'+CONVERT(VARCHAR(10),GETDATE(),120)+'</date>'    
 print'    ///     <programmer>'+SUBSTRING(USER_NAME(), CHARINDEX( '\',USER_NAME())+1,50)+'</programmer>'    
 print'    ///     <document></document>'    
 print'    /// </history>'    
 print'    [Serializable]'    
 print'    public partial class '+@obj+''    
 print'    {'    
 PRINT'        #region Vars'    
 PRINT'        #endregion'    
 PRINT''    
 PRINT'        #region Constructs'    
 PRINT''    
 PRINT'        #endregion'    
 PRINT''    
 PRINT'        #region Properties'    
 PRINT''    
    
 IF  OBJECT_ID('tempdb..#tempColumn') IS NOT NULL DROP TABLE #tempColumn    
 select A.[name],dbo.fn_GetType(B.[name])AS nameType,[value]    
 INTO #tempColumn    
 from sys.columns A    
 join dbo.systypes B on B.xtype=A.system_type_id    
 LEFT JOIN fn_listextendedProperty (    
 'MS_Description', 'Schema', 'dbo', 'table',@obj , 'COLUMN', null) C    
 ON  C.[objname]COLLATE Latin1_General_CI_AS=A.[name]    
 where [object_id]=object_id(@obj)    
 ORDER BY Column_id    
    
    
 WHILE EXISTS(SELECT  1 FROM #tempColumn)    
 BEGIN    
    
  SELECT TOP 1 @name=[name]    
  ,@nameType=nameType    
  ,@value=CAST([value] AS NVARCHAR(200))    
  FROM #tempColumn    
  print'        #region '+ISNULL(@value,@name)    
  PRINT''    
  print'        private ' +@nameType+' auto'+@name+';'    
    
  print'        /// <summary>'    
  print'        /// Gets or sets The '+ISNULL(@value,@name)    
  print'        /// </summary>'    
  print'        public virtual '+@nameType+' '+@name    
  print'        {'    
  print'            get { return this.auto'+@name+'; }'    
  print'            set { this.auto'+@name+' = value; }'    
  print'        }'    
  PRINT'        #endregion'    
  PRINT''    
  DELETE  #tempColumn WHERE [name]=@name    
 END    
 IF  OBJECT_ID('tempdb..#tempColumn') IS NOT NULL     
 DROP TABLE #tempColumn    
 PRINT'        #endregion'    
 PRINT''    
 PRINT'        #region Methods'    
 PRINT''    
 PRINT'        #endregion'    
 print'    }'    
     
RETURN 0    
END

列类型转换Function:

 

CREATE FUNCTION [dbo].[fn_GetType]      
(      
--数据库类型与C#类型之前转换,用于生成代码      
--Created By  2011-08-24      
@SqlType SYSNAME      
)      
RETURNS VARCHAR(20)      
AS      
BEGIN      
 RETURN(      
 SELECT CASE       
 WHEN @SqlType in('bit') THEN 'bool'      
 WHEN @SqlType in('bigint') THEN 'long'      
 WHEN @SqlType in('int') THEN 'int'      
 WHEN @SqlType in('smallint') THEN 'short'     
 WHEN @SqlType in('char','varchar','text','nchar','nvarchar','ntext','xml') THEN 'string'      
 WHEN @SqlType in('date','datetimeoffset','datetime2','smalldatetime','datetime') THEN 'DateTime'      
      
 WHEN @SqlType in('money','smallmoney','decimal') THEN 'decimal'      
 WHEN @SqlType in('float','real') THEN 'double'      
 WHEN @SqlType in('uniqueidentifier') THEN 'Guid'      
 ELSE 'object'      
 END )     
END 

最后可将代码另存,适当调整 ,也可批处理生成。

转载于:https://www.cnblogs.com/stevenmoli/archive/2012/08/24/2654539.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、简介 1.1前言 1、由于最近工作一直用Oracle,故对Oracle数据库研究为对象。 2、根据工作业务需求实际情况进行功能研发。为什么要开发呢?因为在数据库升级或者迁移的时候,为了保证不同环境不同数据库数据保持同步,故数据库SQL脚本非常作用。比如:数据库脚本,副脚本,增量脚本。 3、 什么是主脚本、副脚本、增量脚本呢? 3.1、主脚本数据库表或存储过程,视图脚本,序列等脚本。 3.2、副脚本指必须执行主脚本之后才执行的脚本。换句话说在没执行主键脚本的情况下,副脚本执行之后会回滚事务失败。 3.3、增量脚本指在执行主脚本或副脚本之后,根据需求对某个表添加/修改约束(主外键约束,长度约束等),添加/修改字段/添加数据等情况对数据库结构改变处理的一种行为脚本。 1.2作用 1、 快速产出自定义规则需要的SQL脚本。 2、减少人工编写SQL脚本出错率问题,完全通过程序检测SQL准确性。 3、帮助开发人员提高SQL编写效率,减少人工编写SQL开发成本问题。 4、帮助开发人员节约时间,同时避免繁琐不必要编写SQL的工作。 二、实现方式与原理 2.1实现方式 1、实现方式分:正向与逆向实现。什么是正向与逆行呢【是否有鸡还是有蛋,先后道理同等】 2、正向方式:首先把设计好数据库表文档,把所有表的字段属性配置到EXCEL或者CSV格式的文件通过JXL/POI技术去读取文件的字段,再通过其他技术一系列程序处理之后生成所需要的SQL脚本。 3、逆向方式:首先有数据库表,然后通过ORM持久化技术连接数据库再读取表的字段等属性出来,再通过其他技术一系列程序处理之后生成所需要的SQL脚本。 2.2原理 对数据库软件内置核心表或视图查询出来存储用户行为表结构所有属性信息,对此属性结构信息进行分析与组装所需要SQL脚本
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值