由于之前使用 Linq to Sql来操作数据库,对于数据库的存储过程、函数等比较薄弱。乘着自己闲着的时候,就百度自学了一点存储过程,以防以后要用。
基础通俗易懂的存储过程通过 存储过程学习 ,然后自己写了几个基础的存储过程方便自己了解他的语法。
ALTER PROCEDURE [dbo].[pro_study] @name varchar(50)='huage', --输入参数//全局变量声明 @result varchar(10) OUTPUT --输出参数 AS BEGIN if(select COUNT(1) from t_student where Name=@name)>0 SET @result='存在' ELSE set @result='不存在' END --这边是调用存储过程 --定义变量声明@result 然后输出 DECLARE @result varchar(10) exec test_study 'hauge',@result output PRINT @result--这边是直接给参数返回,不建议使用
对于这边的全局变量的输出,C#的调用方法如下:
public static string DBExecutepParmOutput(CommandType cType, string cText) { using (SqlConnection conn = new SqlConnection(connStr)) { SqlCommand cmd = conn.CreateCommand(); cmd.CommandType = cType; cmd.CommandText = cText; SqlParameter[] parms ={ new SqlParameter("@name","huage"), new SqlParameter("@result",SqlDbType.VarChar,20) }; parms[1].Direction = ParameterDirection.Output; cmd.Parameters.AddRange(parms); conn.Open(); cmd.ExecuteScalar(); return parms[1].Value + ""; } }
这边是通过全局变量的传入,输出所需的结果集
ALTER PROCEDURE [dbo].[pro_study1] @id int AS BEGIN declare @result VARCHAR(20) if(select COunt(1) from t_student where Id=@id)>0 set @result='存在' ELSE set @result='不存在' SELECT @result END
对于这边的局部变量(select)的输出,C#的调用方法如下:
public static string DBExecuteScalar(CommandType cType, string cText, SqlParameter[] parms) { using (SqlConnection conn = new SqlConnection(connStr)) { SqlCommand cmd = conn.CreateCommand(); cmd.CommandType = cType; cmd.CommandText = cText; cmd.Parameters.AddRange(parms); conn.Open(); var res = cmd.ExecuteScalar() + ""; return res; } }
下面是定义局部变量,并且赋值查询表,返回结果集合(C#调用就比较简单_就不展示了)
ALTER PROCEDURE [dbo].[pro_study2] @id varchar(50)--//全局变量 AS --//as 前面的是全局变量,后面的是局部变量 DECLARE @name varchar(50) --//局部变量 set @name='huage' BEGIN set @id=1 select * from t_student where Name=@name select * from t_student where Id=@id END
下面是输出数据库里面内置函数的结果集:
ALTER PROCEDURE [dbo].[pro_rowcount] AS BEGIN INSERT into t_student VALUES ('huage','11','男神'), ('wudi','12','女神') --begin...end 类似编程语言中的{} select @@rowcount --返回影响的行数 select @@identity --返回最近插入的标识列的Id END
下面是使用游标循环数据库表的基本语法
ALTER PROCEDURE [dbo].[pro_youbiao] AS BEGIN DECLARE @temp int,--定义的游标的变量 @error INT --记录错误 DECLARE m_cursor CURSOR FOR (select Id from t_student)--定义游标 OPEN m_cursor --打开游标 --开始循环游标变量-- FETCH NEXT FROM m_cursor into @temp WHILE @@FETCH_Status=0 --返回被 FETCH语句执行的最后游标的状态-- --这边是对数据的操作 BEGIN--beging end 相当于C#中的{} UPDATE t_student SET test=CONVERT(VARCHAR(10),@temp) where Id=@temp set @error=@error+@@ERROR -- --记录每次运行sql后是否正确,0正确 FETCH next FROM m_cursor into @temp --转到下一个游标,没有会死循环 END close m_cursor --关闭游标 deallocate m_cursor --释放游标 SELECT @error END