您的位置:首页 > 其它

自动生成基于单表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





                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐