数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

SQL Server编写存储过程小工具


发布日期:2021年03月09日
 
SQL Server编写存储过程小工具

在开发数据库系统的过程中经常要写很多的存储过程为了统一格式和简化开发过程我编写一些存储过程用来自动生成存储过程下面就为您简单介绍一下它们其中一个用于生成Insert过程另一个用于生成Update过程

Sp_GenInsert

该过程运行后它为给定的表生成一个完整的Insert过程如果原来的表有标识列您得将生成的过程中的SET IDNTITY_INSERT ON 语句手工删除

语法如下

sp_GenInsert < Table Name >< Stored Procedure Name >

以northwind 数据库为例

sp_GenInsert Employees INS_Employees

最后会生成一个Insert存储过程利用它您可以作进一步的开发

Sp_GenUpdate

它会为一个表生成update存储过程语法如下

sp_GenUpdate < Table Name >< Primary Key >< Stored Procedure Name >

以northwind 数据库为例

sp_GenUpdate EmployeesEmployeeIDUPD_Employees

运行后生成如下所示的存储过程

Create Procedure UPD_Employees

@EmployeeID int

@LastName nvarchar()

@FirstName nvarchar()

@Title nvarchar()

@TitleofCourtesy nvarchar()

@BirthDate datetime

@HireDate datetime

@Address nvarchar()

@City nvarchar()

@Region nvarchar()

@PostalCode nvarchar()

@Country nvarchar()

@HomePhone nvarchar()

@Extension nvarchar()

@Phote image

@Notes ntext

@ReportsTo int

@PhotoPath nvarchar()

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()

@ProcedureName varchar()

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 as colorder into #TempProc

union

select convert(char()@ + syscolumnsname)

+ rtrim(systypesname)

+ case when rtrim(systypesname) in (binarycharncharnvarcharvarbinaryvarchar) then ( + rtrim(convert(char()syscolumnslength)) + )

when rtrim(systypesname) not in (binarycharncharnvarcharvarbinaryvarchar) then

end

+ case when colorder < @maxcol then ','

when colorder = @maxcol then ' '

end

as type,

colorder

from syscolumns

join systypes on syscolumns.xtype = systypes.xtype

where id = @TableID and systypes.name <> '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 < @maxcol then ','

when colorder = @maxcol then ' '

end

as type,

colorder + @maxcol + 3 as colorder

from syscolumns

join systypes on syscolumns.xtype = systypes.xtype

where id = @TableID and systypes.name <> '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 < @maxcol then ','

when colorder = @maxcol then ' '

end

as type,

colorder + (2 * @maxcol + 6) as colorder

from syscolumns

join systypes on syscolumns.xtype = systypes.xtype

where id = @TableID and systypes.name <> '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系统数据库中创建该过程,那您就可以在您服务器上所有的数据库中使用该过程。tW.wINgwIT.cOm

===========================================================*/

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 < @maxcol then ','

when colorder = @maxcol then ' '

end

as type,

colorder

from syscolumns

join systypes on syscolumns.xtype = systypes.xtype

where id = @TableID and systypes.name <> '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 < @maxcol then ','

when colorder = @maxcol then ' '

end

as type,

colorder + @maxcol + 3 as colorder

from syscolumns

join systypes on syscolumns.xtype = systypes.xtype

where id = @TableID and syscolumns.name <> @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

/*===============源程序结束==================*/

上一篇:SQL Server实用操作小技巧集合

下一篇:SQL Server加密存储过程的破解问题