1. 程式人生 > >SQL 之存儲過程

SQL 之存儲過程

ren rod table str where 調用存儲過程 exist cnblogs conf

  • 存儲過程
    • 是用來執行管理任務或應用復雜的業務規則,
    • 存儲過程中可以包含邏輯控制語句和數據操縱語句,它可以接受參數、輸出參數、返回單個或多個結果集以及返回值。

  • 存儲過程的優點
    • 存儲過程已在服務器註冊
    • 執行速度更快
    • 允許模塊化程序設計
    • 提高系統安全性 減少網絡流通量    

  • 系統存儲過程
    1.  由系統定義,存放在master數據庫中
    2.  系統存儲過程的名稱都以“sp_”開頭或“xp_”開頭

  • 常見的系統存儲過程

 

exec sp_databases; --查看數據庫
exec sp_tables;        --查看表
exec sp_columns student;--
查看列 exec sp_helpIndex student;--查看索引 exec sp_helpConstraint student;--約束 exec sp_stored_procedures; exec sp_helptext sp_stored_procedures;--查看存儲過程創建、定義語句 exec sp_rename student, stuInfo;--修改表、索引、列的名稱 exec sp_renamedb myTempDB, myDB;--更改數據庫名稱 exec sp_defaultdb master, myDB;--更改登錄名的默認數據庫 exec sp_helpdb;--
數據庫幫助,查詢數據庫信息 exec sp_helpdb master;

  • 擴充存儲過程
    • 可以執行DOS命令下的一些的操作
    • 以文本行方式返回任何輸出
    • 調用語法: EXEC xp_cmdshell DOS命令 [NO_OUTPUT]
    • 啟動方法:
       EXEC sp_configure show advanced options, 1
      GO
      RECONFIGURE
      GO
      EXEC sp_configure xp_cmdshell, 1
      GO
      RECONFIGURE
      GO 

    • 示例:
      /*創建數據庫bankDB,要求保存在D:\bank
      */
      
      USE master
      
      GO EXEC xp_cmdshell mkdir d:\bank, NO_OUTPUT IF EXISTS(SELECT * FROM sysdatabases WHERE name=bankDB) DROP DATABASE bankDB GO CREATE DATABASE bankDB ( … ) GO EXEC xp_cmdshell dir D:\bank\ --查看文件

   

  • 定義存儲過程的語法

    

CREATE PROC[DEURE]  存儲過程名
@參數1 數據類型 = 默認值 [OUTPUT],
@參數2 數據類型 = 默認值 [OUTPUT],
...
@參數n 數據類型 = 默認值 [OUTPUT]

AS

SQL語句

GO

  • 調用存儲過程   

    

EXEC  過程名 [參數]

  • 用戶自定義存儲過程

  1.  創建不帶參數存儲過程
    --創建存儲過程
    if (exists (select * from sys.objects where name = proc_get_student))
        drop proc proc_get_student
    go
    create proc proc_get_student
    as
        select * from student;
    
    --調用、執行存儲過程
    exec proc_get_student;

  2. 修改存儲過程
    --修改存儲過程
    alter proc proc_get_student
    as
    select * from student;

  3. 帶參存儲過程
    --帶參存儲過程
    if (object_id(proc_find_stu, P) is not null)
        drop proc proc_find_stu
    go
    create proc proc_find_stu(@startId int, @endId int)
    as
        select * from student where id between @startId and @endId
    go
    
    exec proc_find_stu 2, 4;

  4. 帶通配符參數存儲過程
    --帶通配符參數存儲過程
    if (object_id(proc_findStudentByName, P) is not null)
        drop proc proc_findStudentByName
    go
    create proc proc_findStudentByName(@name varchar(20) = %j%, @nextName varchar(20) = %)
    as
        select * from student where name like @name and name like @nextName;
    go
    
    exec proc_findStudentByName;
    exec proc_findStudentByName %o%, t%;

  5. 帶輸出參數存儲過程
    if (object_id(proc_getStudentRecord, P) is not null)
        drop proc proc_getStudentRecord
    go
    create proc proc_getStudentRecord(
        @id int, --默認輸入參數
        @name varchar(20) out, --輸出參數
        @age varchar(20) output--輸入輸出參數
    )
    as
        select @name = name, @age = age  from student where id = @id and sex = @age;
    go
    
    -- 
    declare @id int,
            @name varchar(20),
            @temp varchar(20);
    set @id = 7; 
    set @temp = 1;
    exec proc_getStudentRecord @id, @name out, @temp output;
    select @name, @temp;
    print @name + # + @temp;

  6. 不緩存存儲過程
    --WITH RECOMPILE 不緩存
    if (object_id(proc_temp, P) is not null)
        drop proc proc_temp
    go
    create proc proc_temp
    with recompile
    as
        select * from student;
    go
    
    exec proc_temp;

  7. 加密存儲過程
    --加密WITH ENCRYPTION 
    if (object_id(proc_temp_encryption, P) is not null)
        drop proc proc_temp_encryption
    go
    create proc proc_temp_encryption
    with encryption
    as
        select * from student;
    go
    
    exec proc_temp_encryption;
    exec sp_helptext proc_temp;
    exec sp_helptext proc_temp_encryption;

  8. 帶遊標參數存儲過程

    if (object_id(proc_cursor, P) is not null)
    
        drop proc proc_cursor
    go
    create proc proc_cursor
        @cur cursor varying output
    as
        set @cur = cursor forward_only static for
        select id, name, age from student;
        open @cur;
    go
    --調用
    declare @exec_cur cursor;
    declare @id int,
            @name varchar(20),
            @age int;
    exec proc_cursor @cur = @exec_cur output;--調用存儲過程
    fetch next from @exec_cur into @id, @name, @age;
    while (@@fetch_status = 0)
    begin
        fetch next from @exec_cur into @id, @name, @age;
        print id:  + convert(varchar, @id) + , name:  + @name + , age:  + convert(char, @age);
    end
    close @exec_cur;
    deallocate @exec_cur;--刪除遊標

  9. 分頁存儲過程

    ---存儲過程、row_number完成分頁
    if (object_id(pro_page, P) is not null)
        drop proc proc_cursor
    go
    create proc pro_page
        @startIndex int,
        @endIndex int
    as
        select count(*) from product
    ;    
        select * from (
            select row_number() over(order by pid) as rowId, * from product 
        ) temp
        where temp.rowId between @startIndex and @endIndex
    go
    --drop proc pro_page
    exec pro_page 1, 4
    --
    --分頁存儲過程
    if (object_id(pro_page, P) is not null)
        drop proc pro_stu
    go
    create procedure pro_stu(
        @pageIndex int,
        @pageSize int
    )
    as
        declare @startRow int, @endRow int
        set @startRow = (@pageIndex - 1) * @pageSize +1
        set @endRow = @startRow + @pageSize -1
        select * from (
            select *, row_number() over (order by id asc) as number from student 
        ) t
        where t.number between @startRow and @endRow;
    
    exec pro_stu 2, 2;

  • 刪除存儲過程
    DROP PROC[EDURE] 過程名

SQL 之存儲過程