大概在三年之前,自己有弄过存储过程,是在oracle的数据库上弄的。
现在项目在ms sql server上了。又有存储过程。
所以需要对这方面进行一个全方面的了解和学习。
1,最基础的存储过程。
从代码解析开始吧。
USE AdventureWorks2008R2;
GO
IF OBJECT_ID ( 'HumanResources.uspGetAllEmployees', 'P' ) IS NOT NULL
DROP PROCEDURE HumanResources.uspGetAllEmployees;
GO
CREATE PROCEDURE HumanResources.uspGetAllEmployees
AS
SET NOCOUNT ON;
SELECT LastName, FirstName, Department
FROM HumanResources.vEmployeeDepartmentHistory;
GO
这个procedure是没有任何意义的。只是做为一个演示。
首先第一句为使用数据库。如果你一个数据库引擎上有多个数据库,那么这个必要的。
go语句之后是一个查询uspGetAllEmployees是否存在。
使用OBJECT_ID ( 'HumanResources.uspGetAllEmployees', 'P' )进行查询。而后面第二个参数为“P”,所表示的意思是查询procedure。
与oracle的不同。 oracle采用是CREATE OR REPLACE。
第二个才是procedure的开始。
他里面其实就是一个很简单的查询语句。
这个procedure既没有输入,也没有输出。
所以没有什么很大的含义。这个值作为一个入门来使用。
ms server 执行动态sql
传参为@tablename,我需要建立一个以传参名的table。
定义
declare @sql varchar(200)='create table '+@tablename+'(id int)'
然后使用
exec @sql
始终执行不成
原因是不能这样定义。
需要分开定义
如:
declare @sql varchar(200)
set @sql='create table'+@tablename+(id int)
exec @sql
这样才能执行成功。
sysobjects中type字段类型解释:
C = CHECK 约束
D = 默认值或 DEFAULT 约束
F = FOREIGN KEY 约束
L = 日志
FN = 标量函数
IF = 内嵌表函数
P = 存储过程
PK = PRIMARY KEY 约束(类型是 K)
RF = 复制筛选存储过程
S = 系统表
TF = 表函数
TR = 触发器
U = 用户表
UQ = UNIQUE 约束(类型是 K)
V = 视图
X = 扩展存储过程
数据库存储过程是不支持数组类型的,
如果说对方需要更新一个数组内的所有数据该怎么办呢“?
那么我们采用string到数组的方式,不过这里必须定义一个分割的符号,如“,”。
以下就是一个类似的存储过程
alter PROCEDURE testArray
@ID nvarchar(500)
as
DECLARE @PointerPrev int
DECLARE @PointerCurr int
DECLARE @TId int
Set @PointerPrev=1
while (@PointerPrev < LEN(@ID))
Begin
Set @PointerCurr=CharIndex(',',@ID,@PointerPrev)
if(@PointerCurr>0)
Begin
set @TId=cast(SUBSTRING(@ID,@PointerPrev,@PointerCurr-@PointerPrev) as int)
select @TId
SET @PointerPrev = @PointerCurr+1
End
else
Break
End
--删除最后一个,因为最后一个后面没有逗号,所以在循环中跳出,需另外再删除
set @TId=cast(SUBSTRING(@ID,@PointerPrev,LEN(@ID)-@PointerPrev+1) as int)
select @TId
GO
存储过程是在网络上找的。 可以使用
执行方法:
exec testArray @ID='1,2,3,4,5,6,7,8,9'
-----------------------------------------------------------------
对于存储过程报错的问题。
如果你没有进行检测而去直接执行sql,那么会出现异常。
如果你可以获取这个异常信息,
当然我还是建议大家把异常进行捕获。
delcare @msg varchar(200)
delcare @MyError int=@@Error
select top 1 @msg = description from sys.sysmessages
where error = @MyError and msglangid = 2052 --中文描述