自动生成基于单表CRUD的操作存储过程
2013-05-07 20:22
337 查看
/* *自动生成基于单表CRUD的操作存储过程 *供Excel,WS调用 *参数:表明,自增ID名 *结果:存储过程SQL * *2013-05-0720:15:20 *JackChain */ AlterPROCP_AutoCreateXMLWSProc(@TableNameVARCHAR(30),@PrimaryKeyVARCHAR(20))AS BEGIN --创建表结构游标 DECLAREMyCurCURSORFOR Select fieldName=a.name, fieldType=b.name, fieldLength=a.length, decimalLen=COLUMNPROPERTY(a.id,a.name,'PRECISION'), xsw=isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0) FROMsyscolumnsa leftjoinsystypesbona.xusertype=b.xusertype innerjoinsysobjectsdon(a.id=d.id)and(d.xtype='U')and(d.name<>'dtproperties') leftjoinsyscommentseona.cdefault=e.id leftjoinsys.extended_propertiesgon(a.id=g.major_id)and(a.colid=g.minor_id) leftjoinsys.extended_propertiesfon(d.id=f.major_id)and(f.minor_id=0) whered.name=@TableName orderbya.id,a.colorder; --变量 DECLARE@fieldNameVARCHAR(20); DECLARE@fieldTypeVARCHAR(20); DECLARE@fieldLengthVARCHAR(4); DECLARE@decimalLenVARCHAR(4); DECLARE@xswVARCHAR(4); DECLARE@StructureVARCHAR(MAX); DECLARE@FieldsVARCHAR(MAX); DECLARE@UpdateFieldsVARCHAR(MAX); SET@Structure=''; SET@Fields=''; SET@UpdateFields=''; openMyCur; fetchnextfromMyCurinto@fieldName,@fieldType,@fieldLength,@decimalLen,@xsw; WHILE(@@FETCH_STATUS=0) BEGIN --表结构 SET@Structure=@Structure+@fieldName+''+ CASEWHEN@fieldType='int'THEN'int' WHEN@fieldType='decimal'THEN'decimal('+@decimalLen+','+@xsw+')' ELSE@fieldType+'('+@fieldLength+')'END+','+char(10)+CHAR(9)+CHAR(9)+CHAR(9)+CHAR(9)+CHAR(9)+CHAR(9); --字段 set@Fields=@Fields+@fieldName+','+char(10)+CHAR(9)+CHAR(9)+CHAR(9)+CHAR(9)+CHAR(9); --更新 SET@UpdateFields=@UpdateFields+@TableName+'.'+@fieldName+'=(CASEWHEN#TEMP.'+@fieldName+'ISNOTNULLTHEN#TEMP.'+@fieldName+'ELSE'+@TableName+'.'+@fieldName+'END),'+char(10)+CHAR(9)+CHAR(9)+CHAR(9)+CHAR(9)+CHAR(9); fetchnextfromMyCurinto@fieldName,@fieldType,@fieldLength,@decimalLen,@xsw; END SET@Structure=SUBSTRING(@Structure,1,LEN(@Structure)-2); SET@Fields=SUBSTRING(@Fields,1,LEN(@Fields)-2); SET@UpdateFields=SUBSTRING(@UpdateFields,1,LEN(@UpdateFields)-2); closeMyCur; deallocateMyCur; --开始构造存储过程 DECLARE@procSqlVARCHAR(MAX); SET@procSql=N' /************************************************************ *JackChain *CRUD操作,供Excel调用 *参数:XML *参数格式:<ROOT><OPTYPE>READ/CREATE/UPDATE/DELETE</OPTYPE><PARAMS>....</PRARMS></ROOT> *Time:2013/5/716:58:53 ************************************************************/ CREATEPROC[dbo].[WSXML_'+@TableName+'](@XMLNVARCHAR(max)) AS BEGIN DECLARE@XML_XMLXML SET@XML_XML=CONVERT(XML,@xml) SETXACT_ABORTON BEGINTRAN DECLARE@tran_errorINT; SET@tran_error=0; DECLARE@error_msgVARCHAR(8000); BEGINTRY DECLARE@TYPEVARCHAR(10) --首先判断操作类型 SELECT@TYPE=@XML_XML.value(N''(/ROOT/OPTYPE)[1]'',''VARCHAR(10)''); --如果是读取 IF(@TYPE=''READ'') BEGIN COMMITTRAN; DECLARE@StartVARCHAR(10); DECLARE@LimitVARCHAR(10); SELECT@Start=@XML_XML.value(N''(/ROOT/PARAMS/START)[1]'',''VARCHAR(10)''); SELECT@Limit=@XML_XML.value(N''(/ROOT/PARAMS/LIMIT)[1]'',''VARCHAR(10)''); IF(@StartISNULLOR@LimitISNULL) BEGIN SELECT(SELECT*FROM'+@TableName+'ORDERBY'+@PrimaryKey+'DESCFORXMLPATH(''ROW''),ROOT(''LIST'')); RETURN; END ELSEIF(@Start=''''OR@Limit='''') BEGIN SELECT''<LIST></LIST>''; RETURN; END EXECWSXML_Pagation'''+@TableName+''','''+@PrimaryKey+''',@Start,@Limit,'''',1 RETURN; END --首先将xml转换为数据集 DECLARE@PointerINT; EXECUTEsp_xml_preparedocument@PointerOUTPUT,@XML_XML; SELECT* INTO#TEMP FROMOPENXML(@Pointer,N''/ROOT/PARAMS/ROW'',3) WITH( '+@Structure+' ); EXECsp_xml_removedocument@Pointer; IF(@TYPE=''CREATE'')--新增 BEGIN INSERTINTOPSPINFO ( '+replace(@Fields,@PrimaryKey+',','')+' ) SELECT '+replace(@Fields,@PrimaryKey+',','')+' FROM#TEMP; END ELSE IF(@TYPE=''DELETE'')--删除,按照主键 BEGIN DELETEFROM'+@TableName+'WHERE'+@PrimaryKey+'IN(SELECT'+@PrimaryKey+'FROM#TEMP); END ELSE IF(@TYPE=''UPDATE'')--更新 BEGIN UPDATEPSMINF SET '+@UpdateFields+' FROM'+@TableName+', #TEMP WHERE'+@TableName+'.'+@PrimaryKey+'=#TEMP.'+@PrimaryKey+'; END ELSE BEGIN COMMITTRAN; SELECT ''<RESTULT><STATE>9</STATE><MSG>操作参数错误!</MSG></RESULT>''; RETURN; END ENDTRY BEGINCATCH SET@tran_error=1; SET@error_msg=ERROR_MESSAGE(); ENDCATCH IF(@tran_error>0) BEGIN ROLLBACKTRAN; SELECT''<RESTULT><STATE>9</STATE><MSG>''+@error_msg+ ''</MSG></RESULT>''; END ELSE BEGIN --没有异常,提交事务 COMMITTRAN; SELECT ''<RESTULT><STATE>0</STATE><MSG>恭喜您,操作成功!</MSG></RESULT>''; END END '; PRINT@procSql; END
自动生成的SQL代码:
/************************************************************ *JackChain *CRUD操作,供Excel调用 *参数:XML *参数格式:<ROOT><OPTYPE>READ/CREATE/UPDATE/DELETE</OPTYPE><PARAMS>....</PRARMS></ROOT> *Time:2013/5/716:58:53 ************************************************************/ CREATEPROC[dbo].[WSXML_PSMCINF](@XMLNVARCHAR(max)) AS BEGIN DECLARE@XML_XMLXML SET@XML_XML=CONVERT(XML,@xml) SETXACT_ABORTON BEGINTRAN DECLARE@tran_errorINT; SET@tran_error=0; DECLARE@error_msgVARCHAR(8000); BEGINTRY DECLARE@TYPEVARCHAR(10) --首先判断操作类型 SELECT@TYPE=@XML_XML.value(N'(/ROOT/OPTYPE)[1]','VARCHAR(10)'); --如果是读取 IF(@TYPE='READ') BEGIN COMMITTRAN; DECLARE@StartVARCHAR(10); DECLARE@LimitVARCHAR(10); SELECT@Start=@XML_XML.value(N'(/ROOT/PARAMS/START)[1]','VARCHAR(10)'); SELECT@Limit=@XML_XML.value(N'(/ROOT/PARAMS/LIMIT)[1]','VARCHAR(10)'); IF(@StartISNULLOR@LimitISNULL) BEGIN SELECT(SELECT*FROMPSMCINFORDERBYSCRCIDDESCFORXMLPATH('ROW'),ROOT('LIST')); RETURN; END ELSEIF(@Start=''OR@Limit='') BEGIN SELECT'<LIST></LIST>'; RETURN; END EXECWSXML_Pagation'PSMCINF','SCRCID',@Start,@Limit,'',1 RETURN; END --首先将xml转换为数据集 DECLARE@PointerINT; EXECUTEsp_xml_preparedocument@PointerOUTPUT,@XML_XML; SELECT* INTO#TEMP FROMOPENXML(@Pointer,N'/ROOT/PARAMS/ROW',3) WITH( SCRCIDint, SCITNOvarchar(15), SCCLIDvarchar(15), SCM3NOvarchar(20), SCCLNMvarchar(15), SCCRPEvarchar(20), SCCRDTvarchar(8), SCCRTMvarchar(8), SCPURSint, SCTLQTdecimal(18,6), SCTLNMint, SCJPEGvarchar(100), ); EXECsp_xml_removedocument@Pointer; IF(@TYPE='CREATE')--新增 BEGIN INSERTINTOPSPINFO ( SCITNO, SCCLID, SCM3NO, SCCLNM, SCCRPE, SCCRDT, SCCRTM, SCPURS, SCTLQT, SCTLNM, SCJPEG, ) SELECT SCITNO, SCCLID, SCM3NO, SCCLNM, SCCRPE, SCCRDT, SCCRTM, SCPURS, SCTLQT, SCTLNM, SCJPEG, FROM#TEMP; END ELSE IF(@TYPE='DELETE')--删除,按照主键 BEGIN DELETEFROMPSMCINFWHERESCRCIDIN(SELECTSCRCIDFROM#TEMP); END ELSE IF(@TYPE='UPDATE')--更新 BEGIN UPDATEPSMINF SET PSMCINF.SCRCID=(CASEWHEN#TEMP.SCRCIDISNOTNULLTHEN#TEMP.SCRCIDELSEPSMCINF.SCRCIDEND), PSMCINF.SCITNO=(CASEWHEN#TEMP.SCITNOISNOTNULLTHEN#TEMP.SCITNOELSEPSMCINF.SCITNOEND), PSMCINF.SCCLID=(CASEWHEN#TEMP.SCCLIDISNOTNULLTHEN#TEMP.SCCLIDELSEPSMCINF.SCCLIDEND), PSMCINF.SCM3NO=(CASEWHEN#TEMP.SCM3NOISNOTNULLTHEN#TEMP.SCM3NOELSEPSMCINF.SCM3NOEND), PSMCINF.SCCLNM=(CASEWHEN#TEMP.SCCLNMISNOTNULLTHEN#TEMP.SCCLNMELSEPSMCINF.SCCLNMEND), PSMCINF.SCCRPE=(CASEWHEN#TEMP.SCCRPEISNOTNULLTHEN#TEMP.SCCRPEELSEPSMCINF.SCCRPEEND), PSMCINF.SCCRDT=(CASEWHEN#TEMP.SCCRDTISNOTNULLTHEN#TEMP.SCCRDTELSEPSMCINF.SCCRDTEND), PSMCINF.SCCRTM=(CASEWHEN#TEMP.SCCRTMISNOTNULLTHEN#TEMP.SCCRTMELSEPSMCINF.SCCRTMEND), PSMCINF.SCPURS=(CASEWHEN#TEMP.SCPURSISNOTNULLTHEN#TEMP.SCPURSELSEPSMCINF.SCPURSEND), PSMCINF.SCTLQT=(CASEWHEN#TEMP.SCTLQTISNOTNULLTHEN#TEMP.SCTLQTELSEPSMCINF.SCTLQTEND), PSMCINF.SCTLNM=(CASEWHEN#TEMP.SCTLNMISNOTNULLTHEN#TEMP.SCTLNMELSEPSMCINF.SCTLNMEND), PSMCINF.SCJPEG=(CASEWHEN#TEMP.SCJPEGISNOTNULLTHEN#TEMP.SCJPEGELSEPSMCINF.SCJPEGEND), FROMPSMCINF, #TEMP WHEREPSMCINF.SCRCID=#TEMP.SCRCID; END ELSE BEGIN COMMITTRAN; SELECT '<RESTULT><STATE>9</STATE><MSG>操作参数错误!</MSG></RESULT>'; RETURN; END ENDTRY BEGINCATCH SET@tran_error=1; SET@error_msg=ERROR_MESSAGE(); ENDCATCH IF(@tran_error>0) BEGIN ROLLBACKTRAN; SELECT'<RESTULT><STATE>9</STATE><MSG>'+@error_msg+ '</MSG></RESULT>'; END ELSE BEGIN --没有异常,提交事务 COMMITTRAN; SELECT '<RESTULT><STATE>0</STATE><MSG>恭喜您,操作成功!</MSG></RESULT>'; END END
相关文章推荐
- 基于OCILIB的oracle数据库操作总结及自动生成Model和Dao的工具
- 基于MVC4+EasyUI的Web开发框架经验总结(14)--自动生成图标样式文件和图标的选择操作
- 自动生成数据对象代码和CRUD操作的C#代码生成器
- [醒目] 自动生成hql[基于javabean的操作][Java reflect 技术的体现]
- 基于MVC4+EasyUI的Web开发框架经验总结(14)--自动生成图标样式文件和图标的选择操作
- 基于MVC+EasyUI的Web开发框架经验总结(14)--自动生成图标样式文件和图标的选择操作
- (转)基于MVC4+EasyUI的Web开发框架经验总结(14)--自动生成图标样式文件和图标的选择操作
- Mybatis-Generator自动生成映射配置文件和CRUD操作
- 基于MVC4+EasyUI的Web开发框架经验总结(14)--自动生成图标样式文件和图标的选择操作
- sqlSever 存储过程 中 创建 事务(增删改操作),唯一的主键自动生成 (格式:自定义字母+时间+五位数字,例如:S2014103010001)
- Mybatis的CRUD操作(基于xml)
- 基于Bootstrap的Metronic框架实现条码和二维码的生成及打印处理操作
- 基于php和mysql的简单的dao类实现crud操作功能
- 基于MVC4+EasyUI的Web开发框架形成之旅--基类控制器CRUD的操作
- 自动生成存储过程
- 工具——基于SVN自动生成版本号的方法
- MySql之自动生成CRUD代码
- 基于数据库的自动化生成工具,自动生成JavaBean、自动生成数据库文档等(v4.1.2版)
- 分享一个自动生成单据的存储过程
- 基于IdeaIDE的ssm整合框架的maven管理项目,利用映射自动生成dao层,pojo层,mappers层