`

【MSsqlserver】存储过程学习开始

阅读更多
大概在三年之前,自己有弄过存储过程,是在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 --中文描述
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics