注册
 找回密码
 注册
江西广告网
查看: 398|回复: 0
打印 上一主题 下一主题

SQL Server编写存储过程小工具

[复制链接]

该用户从未签到

1
跳转到指定楼层
发表于 2009-2-8 13:46:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
  在开发数据库系统的过程中,经常要写很多的存储过程。为了统一格式和简化开发过程,我编写一些存储过程,用来自动生成存储过程。下面就为您简单介绍一下它们。其中一个用于生成Insert过程,另一个用于生成Update过程。         Sp_GenInsert      该过程运行后,它为给定的表生成一个完整的Insert过程。如果原来的表有标识列,您得将生成的过程中的SET IDNTITY_INSERT ON 语句手工删除。      语法如下      sp_GenInsert ,      以northwind 数据库为例      sp_GenInsert ’Employees’, ’INS_Employees’      最后会生成一个Insert存储过程。利用它,您可以作进一步的开发。         Sp_GenUpdate      它会为一个表生成update存储过程。语法如下:      sp_GenUpdate ,,      以northwind 数据库为例      sp_GenUpdate ’Employees’,’EmployeeID’,’UPD_Employees’      运行后生成如下所示的存储过程:      Create Procedure UPD_Employees      @EmployeeID int      @LastName nvarchar(40) ,      @FirstName nvarchar(20) ,      @Title nvarchar(60) ,      @TitleofCourtesy nvarchar(50) ,      @BirthDate datetime ,      @HireDate datetime ,      @Address nvarchar(120) ,      @City nvarchar(30) ,      @Region nvarchar(30) ,      @PostalCode nvarchar(20) ,      @Country nvarchar(30) ,      @HomePhone nvarchar(48) ,      @Extension nvarchar(8) ,      @Phote image ,      @Notes ntext ,      @ReportsTo int ,      @PhotoPath nvarchar(510)      AS      UPDATE Employees      SET      LastName = @LastName,      FirstName = @FirstName,      Title = @Title,      TitleofCourtesy = @TitleofCourtesy,      BirthDate = @BirthDate,      HireDate = @HireDate,      Address = @Address,      City = @City,      Regin = @Regin,      PostalCode = @PostCode,      Country = @Country,      HomePhone = @HomePhone,      Extension = @Extension,      Photo = @Photo      Notes = @Notes,      ReportsTo = @ReportsTo,      PhotoPath = @PhotoPath      WHERE EmployeeID = @EmployeeID         使用以上的两个存储过程,节省了我不少时间。特别是在改变了表结构后,重新构造各个存储过程的过程中。您可以改写这两个程序,来自动生成别的存储过程。   以下是两个存储过程的源程序   /*==================================================================      语法: sp_GenInsert ,   以northwind 数据库为例   sp_GenInsert 'Employees', 'INS_Employees'      注释:如果您在Master系统数据库中创建该过程,那您就可以在您服务器上所有的数据库中使用该过程。      ==================================================================*/      CREATE procedure sp_GenInsert   @TableName varchar(130),   @ProcedureName varchar(130)   as   set nocount on      declare @maxcol int,   @TableID int      set @TableID = object_id(@TableName)      select @MaxCol = max(colorder)   from syscolumns   where id = @TableID      select 'Create Procedure ' rtrim(@ProcedureName) as type,0 as colorder into #TempProc   union   select convert(char(35),'@' syscolumns.name)    rtrim(systypes.name)    case when rtrim(systypes.name) in ('binary','char','nchar','nvarchar','varbinary','varchar') then '(' rtrim(convert(char(4),syscolumns.length)) ')'   when rtrim(systypes.name) not in ('binary','char','nchar','nvarchar','varbinary','varchar') then ' '   end    case when colorder 'sysname'   union   select 'AS',@maxcol 1 as colorder   union   select 'INSERT INTO ' @TableName,@maxcol 2 as colorder   union   select '(',@maxcol 3 as colorder   union   select syscolumns.name    case when colorder 'sysname'   union   select ')',(2 * @maxcol) 4 as colorder   union   select 'VALUES',(2 * @maxcol) 5 as colorder   union   select '(',(2 * @maxcol) 6 as colorder   union   select '@' syscolumns.name    case when colorder 'sysname'   union   select ')',(3 * @maxcol) 7 as colorder   order by colorder         select type from #tempproc order by colorder      drop table #tempproc   功能:为给定表创建Update存储过程   语法: sp_GenUpdate ,,   以northwind 数据库为例   sp_GenUpdate 'Employees','EmployeeID','UPD_Employees'      注释:如果您在Master系统数据库中创建该过程,那您就可以在您服务器上所有的数据库中使用该过程。      ===========================================================*/   CREATE procedure sp_GenUpdate   @TableName varchar(130),   @PrimaryKey varchar(130),   @ProcedureName varchar(130)   as   set nocount on      declare @maxcol int,   @TableID int      set @TableID = object_id(@TableName)      select @MaxCol = max(colorder)   from syscolumns   where id = @TableID      select 'Create Procedure ' rtrim(@ProcedureName) as type,0 as colorder into #TempProc   union   select convert(char(35),'@' syscolumns.name)    rtrim(systypes.name)    case when rtrim(systypes.name) in ('binary','char','nchar','nvarchar','varbinary','varchar') then '(' rtrim(convert(char(4),syscolumns.length)) ')'   when rtrim(systypes.name) not in ('binary','char','nchar','nvarchar','varbinary','varchar') then ' '   end    case when colorder 'sysname'   union   select 'AS',@maxcol 1 as colorder   union   select 'UPDATE ' @TableName,@maxcol 2 as colorder   union   select 'SET',@maxcol 3 as colorder   union   select syscolumns.name ' = @' syscolumns.name    case when colorder @PrimaryKey and systypes.name 'sysname'   union   select 'WHERE ' @PrimaryKey ' = @' @PrimaryKey,(2 * @maxcol) 4 as colorder   order by colorder         select type from #tempproc order by colorder      drop table #tempproc   /*===============源程序结束==================*/       <
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表