createprocedure sp_GenInsert /**//**//**//* 功能描述:自动生成对数据表进行插入的存储过程的存储过程 */ ( @TableNamevarchar(130), --数据表名称 @ProcedureNamevarchar(130) --生成的插入存储过程名称 ) as set nocount on declare@maxcolint, @TableIDint set@TableID=object_id(@TableName) select@MaxCol=max(colorder) from syscolumns where id =@TableID select'Create Procedure 'rtrim(@ProcedureName) as type,0as colorder into #TempProc union selectconvert(char(35),'@' syscolumns.name) rtrim(systypes.name) casewhenrtrim(systypes.name) in ('binary','char','nchar','nvarchar','varbinary','varchar') then'('rtrim(convert(char(4),syscolumns.length)) ')' whenrtrim(systypes.name) notin ('binary','char','nchar','nvarchar','varbinary','varchar') then'' end casewhen colorder <@maxcolthen',' when colorder =@maxcolthen'' end as type, colorder from syscolumns join systypes on syscolumns.xtype = systypes.xtype where id =@TableIDand systypes.name <>'sysname' union select'AS',@maxcol1as colorder union select'INSERT INTO '@TableName,@maxcol2as colorder union select'(',@maxcol3as colorder union select syscolumns.name casewhen colorder <@maxcolthen',' when colorder =@maxcolthen'' end as type, colorder @maxcol3as colorder from syscolumns join systypes on syscolumns.xtype = systypes.xtype where id =@TableIDand systypes.name <>'sysname' union select')',(2*@maxcol) 4as colorder union select'VALUES',(2*@maxcol) 5as colorder union select'(',(2*@maxcol) 6as colorder union select [url=mailto:]'@'[/url] syscolumns.name casewhen colorder <@maxcolthen',' when colorder =@maxcolthen'' end as type, colorder (2*@maxcol6) as colorder from syscolumns join systypes on syscolumns.xtype = systypes.xtype where id =@TableIDand systypes.name <>'sysname' union select')',(3*@maxcol) 7as colorder orderby colorder select type from #tempproc orderby colorder
createprocedure sp_GenUpdate /**//**//**//* 功能描述:自动生成对数据表进行更新操作的存储过程的存储过程 */ ( @TableNamevarchar(130), --数据表名称 @PrimaryKeyvarchar(130), --数据表的主键 @ProcedureNamevarchar(130) --生成的更新操作存储过程名称 ) as set nocount on declare@maxcolint, @TableIDint set@TableID=object_id(@TableName) select@MaxCol=max(colorder) from syscolumns where id =@TableID select'Create Procedure 'rtrim(@ProcedureName) as type,0as colorder into #TempProc union selectconvert(char(35),'@' syscolumns.name) rtrim(systypes.name) casewhenrtrim(systypes.name) in ('binary','char','nchar','nvarchar','varbinary','varchar') then'('rtrim(convert(char(4),syscolumns.length)) ')' whenrtrim(systypes.name) notin ('binary','char','nchar','nvarchar','varbinary','varchar') then'' end casewhen colorder <@maxcolthen',' when colorder =@maxcolthen'' end as type, colorder from syscolumns join systypes on syscolumns.xtype = systypes.xtype where id =@TableIDand systypes.name <>'sysname' union select'AS',@maxcol1as colorder union select'UPDATE '@TableName,@maxcol2as colorder union select'SET',@maxcol3as colorder union select syscolumns.name ' = @' syscolumns.name casewhen colorder <@maxcolthen',' when colorder =@maxcolthen'' end as type, colorder @maxcol3as colorder from syscolumns join systypes on syscolumns.xtype = systypes.xtype where id =@TableIDand syscolumns.name <>@PrimaryKeyand systypes.name <>'sysname' union select'WHERE '@PrimaryKey' = @'@PrimaryKey,(2*@maxcol) 4as colorder orderby colorder select type from #tempproc orderby colorder droptable #tempproc
2.合并
CREATEPROCEDURE SP_CreateProcdure @TableNamenvarchar(50) AS /**//* 功能: 自动生成表的更新数据的存储过程 如:当建立表MyTable后,执行SP_CreateProcdure ,生成表MyTable的数据更 新的存储过程UP_MyTable 设计: OK_008 时间: 2006-05 备注: 1、请在查询分析器上执行:EXEC SP_CreateProcdure TableName 2、由于生成的字符串长度合计很多时候存在>4000以上,所有只使用Print输出, 再Copy即可。 3、该方法能生成一般表的更新数据的存储过程,其中更新格式可以根据实际 情况修改。 设计方法: 1、提取表的各个字段信息 2、 ──┰─ 构造更新数据过程 ├─ 构造存储过程参数部分 ├─ 构造新增数据部分 ├─ 构造更新数据部分 ├─ 构造删除数据部分 3、分段PRINT 4、把输出来的结果复制到新建立存储过程界面中即可使用。 */ DECLARE@strParameternvarchar(3000) DECLARE@strInsertnvarchar(3000) DECLARE@strUpdatenvarchar(3000) DECLARE@strDeletenvarchar(500) DECLARE@strWherenvarchar(100) DECLARE@strNewIDnvarchar(100) DECLARE@SQL_CreateProcnvarchar(4000) SET@SQL_CreateProc='CREATE PROCEDURE UP_'+@TableName+char(13)+'@INTUpdateID int,'+' /* -1 删除 0 修改 1新增 */' SET@strParameter='' SET@strInsert='' SET@strUpdate='' SET@strWhere='' DECLARE@TNamenvarchar(50),@TypeNamenvarchar(50),@TypeLengthnvarchar(50),@Colstatbit DECLARE Obj_Cursor CURSORFOR SELECT*FROM FN_GetObjColInfo(@TableName) OPEN Obj_Cursor FETCHNEXTFROM Obj_Cursor INTO@TName,@TypeName,@TypeLength,@Colstat WHILE@@FETCH_STATUS=0 BEGIN --构造存储过程参数部分 SET@strParameter=@strParameter+CHAR(13)+'@'+@TName+''+@TypeName+',' --构造新增数据部分 IF@Colstat=0SET@strInsert=@strInsert+'@'+@TName+',' --构造更新数据部分 IF (@strWhere='') BEGIN SET@strNewID='SET @'+@TName+'=(Select ISNULL(MAX('+@TName+'),0) From '+@TableName+')+1 --取新的ID' SET@strWhere=' WHERE '+@TName+'='+'@'+@TName END ELSE SET@strUpdate=@strUpdate+@TName+'='+'@'+@TName+',' --构造删除数据部分 FETCHNEXTFROM Obj_Cursor INTO@TName,@TypeName,@TypeLength,@Colstat END CLOSE Obj_Cursor DEALLOCATE Obj_Cursor SET@strParameter=LEFT(@strParameter,LEN(@strParameter)-1) --去掉最右边的逗号 SET@strUpdate=LEFT(@strUpdate,LEN(@strUpdate)-1) SET@strInsert=LEFT(@strInsert,LEN(@strInsert)-1) --存储过程名、参数 PRINT@SQL_CreateProc+@strParameter+CHAR(13)+'AS' --修改 PRINT'IF (@INTUpdateID=0)' PRINT' BEGIN'+CHAR(13) PRINTCHAR(9)+'UPDATE '+@TableName+' SET '+@strUpdate+CHAR(13)+CHAR(9)+@strWhere PRINT' END' --增加 PRINT'IF (@INTUpdateID=1)' PRINT' BEGIN' PRINTCHAR(9)+@strNewID PRINTCHAR(9)+'INSERT INTO '+@TableName+' SELECT '+@strInsert PRINT' END' --删除 PRINT'ELSE' PRINT' BEGIN' PRINTCHAR(9)+'DELETE FROM '+@TableName+@strWhere PRINT' END' PRINT'GO' GO /**//* 其中有的自定义函数FN_GetObjColInfo,代码如下:*/ /**//* 功能:返回某一表的所有字段、存储过程、函数的参数信息 设计:OK_008 时间:2006-05 */ CREATEFUNCTION FN_GetObjColInfo (@ObjNamevarchar(50)) RETURNS@Return_TableTABLE( TName nvarchar(50), TypeName nvarchar(50), TypeLength nvarchar(50), Colstat Bit ) AS BEGIN INSERT@Return_Table select b.name as 字段名,c.name as 字段类型,b.length as 字段长度,b.colstat as 是否自动增长 from sysobjects a innerjoin syscolumns b on a.id=b.id innerjoin systypes c on c.xusertype=b.xtype where a.name =@ObjName orderby B.ColID RETURN END