zoukankan      html  css  js  c++  java
  • SQL server存储过程学习

      由于之前使用 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
  • 相关阅读:
    idea14导入eclipse项目并部署运行完整步骤
    Java之Socket
    Docker之宿主机ssh至docker容器
    ElasticSearch的安装、使用、踩坑
    Linux下grep、tail、wc、awk文件处理命令
    Spring中@Async注解实现“方法”的异步调用
    Thrift——栗子
    Linux中的守护进程——supervise
    【composer】 PHP composer 镜像地址更换
    【Mac】解决macos安装升级时报错安装所选更新时发生错误的问题
  • 原文地址:https://www.cnblogs.com/huage-1234/p/8079383.html
Copyright © 2011-2022 走看看