当CodeSmith不在时……

近日做一个小项目,需要一些简单的存储过程进行表的Insert和Update操作,由于有些表的字段数量很多,一个一个的写字段名太累,于是想到了CodeSmith,可惜翻遍了电脑也没有找到CodeSmith,不知道什么时候给卸载了?于是想到了为何不用存储过程生成存储过程?(据说用机器生产机器代表工业时代的来临……,那SP生产SP算什么,呵呵)

经过一番努力,写出来一个,放在这里留底并供大家参考一下吧,数据库用的是Sql Server 2000。

在查询分析器里面执行:

None.gif L_spCreateSPScript  ' Problem ' , ' 保存问题记录 '


得到如下结果:

None.gif CREATE   PROC  spProblemSave
None.gif    
@ProblemID      uniqueidentifier      -- 问题ID
None.gif
    ,  @ProblemCode      varchar ( 50 )     -- 问题编码
None.gif
    ,  @Description      nvarchar ( 300 )     -- 问题描述
None.gif
    ,  @ProjectID      uniqueidentifier      -- 所属项目ID
None.gif
    ,  @ModuleID      uniqueidentifier      -- 所属模块ID
None.gif
    ,  @PriorityID      int      -- 优先级ID
None.gif
    ,  @CategoryID      int      -- 问题类别ID
None.gif
    ,  @ReporterID      varchar ( 50 )     -- 问题提报者ID
None.gif
    ,  @ReporterName      nvarchar ( 10 )     -- 问题提报者姓名
None.gif
    ,  @ReportDate      smalldatetime      -- 提报日期
None.gif
    ,  @DutyUserID      uniqueidentifier      -- 问题责任人ID
None.gif
    ,  @ResponseDate      smalldatetime      -- 响应日期
None.gif
    ,  @ExpectedSolveDate      smalldatetime      -- 预计解决时间
None.gif
    ,  @ResponseContent      nvarchar ( 300 )     -- 响应内容
None.gif
    ,  @SolveDate      smalldatetime      -- 实际解决日期
None.gif
    ,  @AppraisementID      int      -- 用户评价ID
None.gif
    ,  @AppraisementContent      nvarchar ( 100 )     -- 用户评价内容
None.gif
    ,  @StateID      int      -- 问题状态ID
None.gif
    ,  @IsUsed      bit      -- 是否可用
None.gif
AS
None.gif
-- 保存问题记录
None.gif
IF   EXISTS (
None.gif    
SELECT   TOP   1   1   FROM  Problem  WHERE  ProblemID  =   @ProblemID )
None.gif
BEGIN
None.gif    
-- 更新数据
None.gif
     UPDATE  Problem
None.gif    
SET  ProblemCode  =   @ProblemCode
None.gif        , Description 
=   @Description
None.gif        , ProjectID 
=   @ProjectID
None.gif        , ModuleID 
=   @ModuleID
None.gif        , PriorityID 
=   @PriorityID
None.gif        , CategoryID 
=   @CategoryID
None.gif        , ReporterID 
=   @ReporterID
None.gif        , ReporterName 
=   @ReporterName
None.gif        , ReportDate 
=   @ReportDate
None.gif        , DutyUserID 
=   @DutyUserID
None.gif        , ResponseDate 
=   @ResponseDate
None.gif        , ExpectedSolveDate 
=   @ExpectedSolveDate
None.gif        , ResponseContent 
=   @ResponseContent
None.gif        , SolveDate 
=   @SolveDate
None.gif        , AppraisementID 
=   @AppraisementID
None.gif        , AppraisementContent 
=   @AppraisementContent
None.gif        , StateID 
=   @StateID
None.gif        , IsUsed 
=   @IsUsed
None.gif    
WHERE  ProblemID  =   @ProblemID
None.gif
END
None.gif
ELSE
None.gif
BEGIN
None.gif    
INSERT   INTO  Problem
None.gif    (ProblemCode, Description, ProjectID, ModuleID, PriorityID, CategoryID, ReporterID, ReporterName, ReportDate, DutyUserID, ResponseDate, ExpectedSolveDate, ResponseContent, SolveDate, AppraisementID, AppraisementContent, StateID, IsUsed)
None.gif    
VALUES  
None.gif    (
@ProblemCode @Description @ProjectID @ModuleID @PriorityID @CategoryID @ReporterID @ReporterName @ReportDate @DutyUserID @ResponseDate @ExpectedSolveDate @ResponseContent @SolveDate @AppraisementID @AppraisementContent @StateID @IsUsed )
None.gif
END
None.gif

 

以下是源代码:

None.gif CREATE    PROC  L_spCreateSPScript
None.gif    
@TableName      VARCHAR ( 50 )     -- 需要生成脚本的表名
None.gif
    ,  @SPMemo      VARCHAR ( 100 =   NULL      -- 存储过程说明
None.gif
AS
None.gif
--  根据表名生成一个存储过程脚本,参数为所有列的列名
None.gif
SET  NOCOUNT  ON
None.gif
DECLARE   @SqlScript      VARCHAR ( 8000 )
None.gif
SET   @SqlScript   =   ' CREATE PROC sp '   +   @TableName   +   ' Save '   +   CHAR ( 13 +   CHAR ( 10 )
None.gif
None.gif
DECLARE   @TableID      INT
None.gif
SELECT   @TableID   =   [ ID ]
None.gif
FROM  SysObjects
None.gif
WHERE   [ Name ]   =   @TableName
None.gif
None.gif
IF   @TableID   IS   NULL
None.gif
BEGIN
None.gif    
RAISERROR  ( ' 您输入的表名不存在 ' , 11 , 1 )
None.gif    
RETURN
None.gif
END
None.gif
-- 构建参数
None.gif--
将表的参数放入临时表
None.gif
SELECT  SC. [ Name ]   AS  ColName, ST. [ Name ]   AS  ColType, SC.Length  AS  ColLength, SC.Prec  AS  ColHalfLength
None.gif    , SP.
[ Value ]   AS  ColDesc, SC.ColOrder  AS  ColOrder
None.gif
INTO  #ColTable
None.gif
FROM  SysColumns SC
None.gif
INNER   JOIN  SysTypes ST  ON  ST.xType  =  SC.xType
None.gif
Left   JOIN  SysProperties SP  ON  SP. [ Type ] =   4   AND  SP. [ ID ]   =  SC. [ ID ]   AND  SP.SmallID  =  SC.ColID
None.gif
WHERE  ST. [ Name ]   <>   ' sysname '  
None.gif    
AND  SC. [ ID ]   =   @TableID
None.gif
ORDER   BY  SC. [ ColOrder ]
None.gif
None.gif
-- 取得表的主键,这里约定表的主键总是表的第一个字段
None.gif
DECLARE   @TableKeyName      VARCHAR ( 50 )
None.gif
SELECT   @TableKeyName   =  ColName
None.gif
FROM  #ColTable
None.gif
WHERE  ColOrder = 1
None.gif
None.gif
DECLARE   @ParamForSP      VARCHAR ( 2000 )
None.gif
SET   @ParamForSP   =   ''
None.gif
None.gif
SELECT   @ParamForSP   =   @ParamForSP   +   CHAR ( 9 +   ' , @ '   +  ColName  +   CHAR ( 9 +  ColType 
None.gif    
+   Case   Right (ColType, 4 When   ' char '   Then   ' ( '   +   Cast ( Case   Left (ColType, 1 When   ' n '   Then  ColHalfLength  Else  ColLength  End   AS   VARCHAR ( 10 ))  +   ' ) '   Else   ''   End  
None.gif    
+   Case   When  ColDesc  IS   NOT   NULL   Then   CHAR ( 9 +   ' -- '   +   Cast (ColDesc  AS   NVARCHAR ( 50 ))  Else   ''   End
None.gif    
+   CHAR ( 13 +   CHAR ( 10 )
None.gif
FROM  #ColTable
None.gif
IF   Len ( @ParamForSP >   0
None.gif
BEGIN
None.gif    
SET   @ParamForSP   =   RIGHT ( @ParamForSP , Len ( @ParamForSP -   3 )
None.gif
END
None.gif
None.gif
SET   @SqlScript   =   @SqlScript   +   CHAR ( 9 +   @ParamForSP
None.gif
None.gif
SET   @SqlScript   =   @SqlScript   +   ' AS '   +   CHAR ( 13 +   CHAR ( 10 )
None.gif
None.gif
-- 添加存储过程说明
None.gif
IF   @SPMemo   IS   NOT   NULL
None.gif
BEGIN
None.gif    
SET   @SqlScript   =   @SqlScript   +   ' -- '   +   @SPMemo   +   CHAR ( 13 +   CHAR ( 10 )
None.gif
END
None.gif
None.gif
-- 准备INSERT INTO和UPDATE使用的字段字符串
None.gif
DECLARE   @ParamForInsert      VARCHAR ( 5000 )
None.gif
DECLARE   @ParamForUpdate      VARCHAR ( 5000 )
None.gif
SET   @ParamForInsert   =   ''
None.gif
SET   @ParamForUpdate   =   ''
None.gif
None.gif
SELECT   @ParamForInsert   =   @ParamForInsert   +  ColName  +   ' '
None.gif
FROM  #ColTable
None.gif
WHERE  ColOrder  <>   1
None.gif
IF   Len ( @ParamForInsert >   0
None.gif
BEGIN
None.gif    
SET   @ParamForInsert   =   Left ( @ParamForInsert , Len ( @ParamForInsert -   1 )
None.gif
END
None.gif
None.gif
SELECT   @ParamForUpdate   =   @ParamForUpdate   +   Replicate ( CHAR ( 9 ), 2 +   ' '   +  ColName  +   '  = @ '   +  ColName  +   CHAR ( 13 +   CHAR ( 10 )
None.gif
FROM  #ColTable
None.gif
WHERE  ColOrder  <>   1
None.gif
IF   Len ( @ParamForUpdate >   0
None.gif
BEGIN
None.gif    
SET   @ParamForUpdate   =   Right ( @ParamForUpdate , Len ( @ParamForUpdate -   4 )
None.gif
END
None.gif
None.gif
SET   @SqlScript   =   @SqlScript  
None.gif    
+   ' IF EXISTS(
None.gif    SELECT TOP 1 1 FROM 
'   +   @TableName   +   '  WHERE  '   +   @TableKeyName   +   '  = @ '   +   @TableKeyName   +   ' )
None.gifBEGIN
None.gif    --更新数据
None.gif    UPDATE 
'   +   @TableName   +   '
None.gif    SET 
'   +   @ParamForUpdate   +   CHAR ( 9 +    ' WHERE  '   +   @TableKeyName   +   '  = @ '   +   @TableKeyName   +   '
None.gifEND
None.gifELSE
None.gifBEGIN
None.gif    --新增数据
None.gif    INSERT INTO 
'   +   @TableName   +   CHAR ( 13 +   CHAR ( 10 +   CHAR ( 9 +   ' ( '   +   @ParamForInsert   +   ' )
None.gif    VALUES 
None.gif    (@
'   +   REPLACE ( @ParamForInsert , ' ' , ' , @ ' +   ' )
None.gifEND
None.gif
'
None.gif
None.gif
PRINT   @SqlScript
None.gif
None.gif
DROP   TABLE  #ColTable
None.gif
None.gif
SET  NOCOUNT  OFF

源代码可以在这里下载
顺祝大家五一快乐,我这个五一倒是很忙,要拍婚纱照,经验值为0,希望一切顺利吧,呵呵

转载于:https://www.cnblogs.com/Ricky81317/archive/2007/04/30/733473.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值