SQL 데이터베이스 저장 프로 세 스 예제 분석

저장 프로 세 스 란 무엇 입 니까?저장 프로 세 스 는 기록 집합 이 라 고 할 수 있 습 니 다.이것 은 T-SQL 구문 으로 구 성 된 코드 블록 입 니 다.이런 T-SQL 구문 코드 는 하나의 방법 처럼 일부 기능(단일 표 나 다 중 표 에 대한 추가 삭제 검사)을 실현 한 다음 에 이 코드 블록 에 이름 을 지어 주 고 이 기능 을 사용 할 때 그 를 호출 하면 됩 니 다.
저장 프로시저 의 장점:
1.데이터베이스 에서 동작 을 수행 할 때 먼저 컴 파일 한 후에 실 행 됩 니 다.그러나 저장 과정 은 컴 파일 된 코드 블록 이기 때문에 실행 효율 이 T-SQL 문장 보다 높다.
2.하나의 저장 과정 은 프로그램 이 네트워크 에서 상호작용 을 할 때 많은 T-SQL 문 구 를 대체 할 수 있 기 때문에 네트워크 의 통 신 량 을 낮 추고 통신 속 도 를 높 일 수 있다.
3.저장 과정 을 통 해 권한 이 없 는 사용자 가 제어 하에 데이터 베 이 스 를 간접 적 으로 액세스 하여 데이터 의 안전 을 확보 할 수 있다.
소결:한 마디 로 하면 저장 과정 은 좋 은 것 이 고 프로젝트 를 할 때 필수 적 인 이기 에 속 합 니 다.다음은 저장 과정의 기본 문법 을 소개 합 니 다.
저장 프로 세 스 의 문법 과 매개 변수 설명
저장 프로 세 스 의 기본 문법:

--------------      -----------------

CREATE PROC [ EDURE ] procedure_name [ ; number ]
  [ { @parameter data_type }
    [ VARYING ] [ = default ] [ OUTPUT ]
  ] [ ,...n ]

[ WITH
  { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]

[ FOR REPLICATION ]

AS sql_statement [ ...n ]

--------------      -----------------

EXECUTE Procedure_name '' --         ,        :@   =value,        value

--------------      -----------------

drop procedure procedure_name  --                 ,             

저장 프로시저 생 성 인자:
1.procedure_name:저장 프로 세 스 의 이름 을 앞 에 추가 합 니 다.\#부분 임시 저장 프로 세 스 입 니 다.추가\##전체 임시 저장 프로 세 스 입 니 다.
2.; number:같은 이름 의 프로 세 스 를 그룹 으로 나 눌 수 있 도록 선택 할 수 있 는 정수 입 니 다.DROP PROCEDURE 문 구 를 사용 하면 같은 그룹의 프로 세 스 를 함께 제거 할 수 있 습 니 다.예 를 들 어 orders 라 는 프로그램 이 사용 하 는 과정 을 orderproc 라 고 명명 할 수 있 습 니 다.1、orderproc;2 등.DROP PROCEDURE orderproc 문 구 는 전체 그룹 을 제거 합 니 다.이름 에 정 계 된 식별 자 를 포함 하고 있다 면 숫자 는 식별 자 에 포함 되 어 서 는 안 되 며 procedure 에 만 포함 되 어야 합 니 다.name 앞 뒤로 적당 한 경계선 을 사용 합 니 다.
3.@parameter:저장 과정의 매개 변수 입 니 다.하나 이상 있 을 수 있 습 니 다.사용 자 는 실행 과정 에서 설명 한 매개 변수의 값 을 제공 해 야 합 니 다.(이 매개 변수의 기본 값 을 정의 하지 않 는 한)저장 과정 은 최대 2.100 개의 매개 변 수 를 가 질 수 있다.
매개 변수 이름 을 지정 하려 면@기 호 를 첫 번 째 문자 로 사용 하 십시오.매개 변수 이름 은 식별 자의 규칙 에 부합 해 야 합 니 다.모든 과정의 매개 변 수 는 이 과정 자체 에 만 사 용 됩 니 다.같은 매개 변수 이름 은 다른 과정 에서 사용 할 수 있 습 니 다.기본 적 인 상황 에서 파 라 메 터 는 상수 만 대체 할 수 있 고 표 이름,열 이름 또는 다른 데이터베이스 대상 의 이름 을 대체 할 수 없습니다.더 많은 정보 에 대해 서 는 EXECUTE 를 참조 하 시기 바 랍 니 다.
4.data_type:매개 변수의 데이터 형식 입 니 다.모든 데이터 형식(text,ntext,image 포함)은 저장 과정의 매개 변수 로 사용 할 수 있 습 니 다.단,cursor 데이터 형식 은 OUTPUT 인자 에 만 사용 할 수 있 습 니 다.지정 한 데이터 형식 이 cursor 라면 VARYING 과 OUTPUT 키 워드 를 동시에 지정 해 야 합 니 다.SQL Server 가 제공 하 는 데이터 형식 과 문법 에 대한 더 많은 정 보 는 데이터 형식 을 참조 하 십시오.
cursor 데이터 형식 일 수 있 는 출력 매개 변수 에 대해 최대 수의 제한 이 없다 는 것 을 설명 합 니 다.
5.VARYING:출력 매개 변수 로 지원 하 는 결과 집합 을 지정 합 니 다.커서 파라미터 에 만 적 용 됩 니 다.
6.default:매개 변수의 기본 값 입 니 다.기본 값 이 정의 되면 이 매개 변수의 값 을 지정 하지 않 아 도 과정 을 수행 할 수 있 습 니 다.기본 값 은 상수 나 NULL 이 어야 합 니 다.프로 세 스 가 이 인자 에 LIKE 키 워드 를 사용 할 경우 기본 값 에 마스크(%,,[]포함)와[^].
7.OUTPUT:매개 변 수 는 반환 매개 변수 임 을 나타 낸다.이 옵션 의 값 은 EXEC[UTE]에 되 돌 릴 수 있 습 니 다.OUTPUT 인 자 를 사용 하면 호출 과정 에 정 보 를 되 돌려 줍 니 다.Text,ntext,image 인 자 는 OUTPUT 인자 로 사용 할 수 있 습 니 다.OUTPUT 키 워드 를 사용 하 는 출력 매개 변 수 는 커서 자리 표시 자 일 수 있 습 니 다.
8.RECOMPILE:SQL Server 가 이 프로 세 스 의 계획 을 캐 시 하지 않 음 을 나타 내 며 이 프로 세 스 는 실 행 될 때 다시 컴 파일 됩 니 다.메모리 에 캐 시 된 실행 계획 을 덮어 쓰 지 않 으 려 고 비 전형 값 이나 임시 값 을 사용 할 때 RECOMPILE 옵션 을 사용 하 십시오.
9.ENCRYPTION:SQL Server 암호 화 syscoments 표 에 CREATE PROCEDURE 구문 텍스트 가 포 함 된 항목 을 표시 합 니 다.ENCRYPTION 을 사용 하면 과정 을 SQL Server 복사 의 일부분 으로 발표 하 는 것 을 방지 할 수 있 습 니 다.업그레이드 과정 에서 SQL Server 는 syscoments 에 저 장 된 암호 화 주석 을 이용 하여 암호 화 과정 을 다시 만 드 는 것 을 설명 합 니 다.
10.FOR REPLICATION:구독 서버 에서 복사 로 만 든 저장 과정 을 실행 할 수 없 음 을 지정 합 니 다.FOR REPLICATION 옵션 을 사용 하여 만 든 저장 프로 세 스 는 저장 프로 세 스 로 선별 할 수 있 으 며 복사 과정 에서 만 실 행 될 수 있 습 니 다.이 옵션 은 WITH RECOMPILE 옵션 과 함께 사용 할 수 없습니다.
11.AS:수행 할 작업 을 지정 합 니 다.
12.sql_statement:과정 에 포 함 될 임의의 숫자 와 형식의 Transact-SQL 문 구 를 포함 합 니 다.제한 이 있 습 니 다.
소결:이런 기본 문법 을 본 후에 저 는 문법 에 따라 다양한 저장 과정 을 만 들 겠 습 니 다.
 저장 프로시저 생 성
 
위의 표 에 대해 저 는 저장 과정 을 사용 하여 이 를 조작 합 니 다.
1.단일 기록 집의 저장 과정 만 되 돌려 줍 니 다.

-------------    GetUserAccount     ----------------
create Procedure GetUserAccount
as
select * from UserAccount
go

-------------         ----------------
exec GetUserAccount

결과:select*from UserAccount 코드 를 실행 하 는 것 과 같 습 니 다.결 과 는 전체 표 의 데이터 입 니 다.
2.입 출력 이 없 는 저장 프로시저

-------------    GetUserAccount     ----------------

create Procedure inUserAccount
as
insert into UserAccount (UserName,[PassWord],RegisterTime,RegisterIP) values(9,9,'2013-01-02',9)
go

-------------         ----------------

exec inUserAccount

결과:insert into UserAccount(UsernName,[PassWord],RegisterTime,RegisterIP)values(9,9,'2013-01-02',9)를 실행 하 는 것 과 같 습 니 다.
3.반환 값 이 있 는 저장 과정

-------------    GetUserAccount     ----------------

create Procedure inUserAccountRe
as
insert into UserAccount (UserName,[PassWord],RegisterTime,RegisterIP) values(10,10,'2013-01-02',10)
return @@rowcount
go

-------------         ----------------

exec inUserAccountRe

설명:여기@rowcount 는 저장 과정 에 영향 을 미 치 는 줄 수 를 실행 하기 위해 실 행 된 결 과 는 데 이 터 를 삽입 할 뿐만 아니 라 return value=1 값 도 되 돌려 줍 니 다.  ,이것 은 프로그램 에서 가 져 올 수 있 습 니 다.잠시 후 c\#저장 소 를 호출 하 는 과정 에서 말씀 드 리 겠 습 니 다.
4.입력 매개 변수 와 출력 매개 변수 가 저장 되 는 과정

-------------    GetUserAccount     ----------------

create Procedure GetUserAccountRe
@UserName nchar(20),
@UserID int output
as
if(@UserName>5)
select @UserID=COUNT(*) from UserAccount where UserID>25
else
set @UserID=1000
go

-------------         ----------------

exec GetUserAccountRe '7',null

설명:@UserName 은 입력 매개 변수 이 고@UserID 는 출력 매개 변수 입 니 다.실행 결 과 는@userID 가 COOUT(*)즉=1 입 니 다.
5.반환 값,입력 매개 변수,출력 매개 변 수 를 동시에 가 진 저장 과정

-------------    GetUserAccount     ----------------

create Procedure GetUserAccountRe1
@UserName nchar(20),
@UserID int output
as
if(@UserName>5)
select @UserID=COUNT(*) from UserAccount where UserID>25
else
set @UserID=1000
return @@rowcount
go

-------------         ----------------

exec GetUserAccountRe1 '7',null

결과:@userID 는 COOUT(*)즉=1,Retun Value=1 입 니 다.
6.매개 변수 와 기록 집합 을 동시에 되 돌려 주 는 저장 과정

-------------    GetUserAccount     ----------------

create Procedure GetUserAccountRe2
@UserName nchar(20),
@UserID int output
as
if(@UserName>5)
select @UserID=COUNT(*) from UserAccount where UserID>25
else
set @UserID=1000
select * from UserAccount
return @@rowcount
go

-------------         ----------------

exec GetUserAccountRe2 '7',null

결과:select*from UserAccount 라 는 코드 를 실행 한 결과 집합 을 되 돌려 줍 니 다.또한@userID 는 COOUT(*)즉=1,Retun Value=9 입 니 다.
7.여러 기록 집의 저장 과정 을 되 돌려 줍 니 다.

-------------    GetUserAccount     ----------------

create Procedure GetUserAccountRe3
as
select * from UserAccount
select * from UserAccount where UserID>5
go

-------------         ----------------

exec GetUserAccountRe3

결과:두 개의 결과 집합 을 되 돌려 줍 니 다.하 나 는 select*from UserAccount 이 고,다른 하 나 는 select*from UserAccount where UserID>5 입 니 다.
소결:위 에서 우 리 는 다양한 저장 과정 을 만 들 었 습 니 다.다음은 우리 가 c\#에서 이 저장 과정 을 어떻게 호출 하 는 지 보 겠 습 니 다.
C\#저장 프로시저 호출
여기 서 호출 된 저장 과정 은 위 에 내 가 쓴 각양각색의 저장 과정 이다.

public partial class ProcedureTest : System.Web.UI.Page
  {
    public static string conn = ConfigurationManager.ConnectionStrings["StuRelationDBConnectionString"].ConnectionString;
    public SqlConnection con = new SqlConnection(conn);
    protected void Page_Load(object sender, EventArgs e)
    {
      runGetUserAccountRe3();
    }

    //             GetUserAccount
    public void runGetUserAccount()
    {
      SqlDataAdapter dp = new SqlDataAdapter(common("GetUserAccount"));
      DataSet ds = new DataSet();
      //   dataset 
      dp.Fill(ds);
      rpt.DataSource = ds;
      rpt.DataBind();

    }

    //           inUserAccount
    public void runinUserAccount()
    {      
      con.Open();
      Label1.Text = common("inUserAccount").ExecuteNonQuery().ToString();
      con.Close();
    }

    //         inUserAccountRe
    public void runinUserAccountRe()
    {
      //      
      SqlCommand cmd = common("inUserAccountRe");
      IDataParameter[] parameters = { 
         new SqlParameter("rval", SqlDbType.Int,4) 
       };
      //                
      parameters[0].Direction = ParameterDirection.ReturnValue;
      //      
      cmd.Parameters.Add(parameters[0]);
      con.Open();
      //                
      Label1.Text = cmd.ExecuteNonQuery().ToString();
      con.Close();
      //             
      Label1.Text += "-" + parameters[0].Value.ToString();
    }

    //               
    public void runGetUserAccountRe()
    {
      SqlCommand cmd = common("GetUserAccountRe");
      //      
      IDataParameter[] parameters = { 
         new SqlParameter("@UserName", SqlDbType.NChar,20) , 
         new SqlParameter("@UserID", SqlDbType.Int) ,
       };
      //        
      parameters[0].Value = "7"; 
      parameters[1].Direction = ParameterDirection.Output; //         
      //      
      cmd.Parameters.Add(parameters[0]);
      cmd.Parameters.Add(parameters[1]);
      con.Open();
      //                
      Label1.Text = cmd.ExecuteNonQuery().ToString();
      con.Close();      
      //              
      Label1.Text += "-" + parameters[1].Value.ToString();
      
    }

    //       、    、         GetUserAccountRe1
    public void runGetUserAccountRe1()
    {
      SqlCommand cmd = common("GetUserAccountRe1");
      //      
      IDataParameter[] parameters = { 
         new SqlParameter("@UserName", SqlDbType.NChar,20) , 
         new SqlParameter("@UserID", SqlDbType.Int) ,
         new SqlParameter("rval", SqlDbType.Int,4) 
       };
      //        
      parameters[0].Value = "7";
      parameters[1].Direction = ParameterDirection.Output; //         
      parameters[2].Direction = ParameterDirection.ReturnValue; //      
      //      
      cmd.Parameters.Add(parameters[0]);
      cmd.Parameters.Add(parameters[1]);
      cmd.Parameters.Add(parameters[2]);
      con.Open();
      //                
      Label1.Text = cmd.ExecuteNonQuery().ToString();
      con.Close();
      //              
      Label1.Text += "-     :" + parameters[1].Value.ToString();
      Label1.Text += "-    :" + parameters[2].Value.ToString();

    }

    //               GetUserAccountRe2
    public void runGetUserAccountRe2()
    {
      SqlCommand cmd = common("GetUserAccountRe2");
      //      
      IDataParameter[] parameters = { 
         new SqlParameter("@UserName", SqlDbType.NChar,20) , 
         new SqlParameter("@UserID", SqlDbType.Int) ,
         new SqlParameter("rval", SqlDbType.Int,4) 
       };
      //        
      parameters[0].Value = "7";
      parameters[1].Direction = ParameterDirection.Output; //         
      parameters[2].Direction = ParameterDirection.ReturnValue; //      
      //      
      cmd.Parameters.Add(parameters[0]);
      cmd.Parameters.Add(parameters[1]);
      cmd.Parameters.Add(parameters[2]);
      con.Open();
      //                
      Label1.Text = cmd.ExecuteNonQuery().ToString();
      DataSet ds = new DataSet();
      SqlDataAdapter dt = new SqlDataAdapter(cmd);
      dt.Fill(ds);
      rpt.DataSource = ds;
      rpt.DataBind();
      con.Close();
      //              
      Label1.Text += "-     :" + parameters[1].Value.ToString();
      Label1.Text += "-    :" + parameters[2].Value.ToString();

    }

    //            
    public void runGetUserAccountRe3()
    {
      DataSet ds = new DataSet();
      SqlDataAdapter dt = new SqlDataAdapter(common("GetUserAccountRe3"));
      dt.Fill(ds);
      rpt1.DataSource = ds.Tables[0].DefaultView;
      rpt1.DataBind();
      rpt2.DataSource = ds.Tables[1].DefaultView;
      rpt2.DataBind();
    }
    
    public SqlCommand common(string proName)
    {
      
      SqlCommand cmd = new SqlCommand();
      //   sql   
      cmd.Connection = con;      
      //        
      cmd.CommandText = proName;
      //             
      cmd.CommandType = CommandType.StoredProcedure;
      return cmd;
    }
  }

SQLServer 데이터 베 이 스 를 추가 하 는 전역 변수

select APP_NAME ( ) as w --         

select @@IDENTITY  --           
select USER_NAME()  --          

SELECT @@CONNECTIONS --     SQL              。 
SELECT GETDATE() --     
SELECT @@CPU_BUSY/100 --       SQL    CPU      ,     

USE tempdb SELECT @@DBTS as w --           timestamp       。   timestamp             。 
select @@IDENTITY as w --           
SELECT @@IDLE as w --  SQL           ,      
SELECT @@IO_BUSY AS w  --  SQL                    ,      
SELECT @@LANGID AS w  --                 (ID)。 
SELECT @@LANGUAGE AS w  --           
SELECT @@LOCK_TIMEOUT as w --            ,     。 
SELECT @@MAX_CONNECTIONS as w --  SQL              。               
EXEC sp_configure --               
SELECT @@MAX_PRECISION as w --   decimal   numeric            ,             。      38。 
select @@OPTIONS as w --     SET      。 
SELECT @@PACK_RECEIVED as w --  SQL                  。 
SELECT @@PACK_SENT as w --  SQ                   。 
SELECT @@PACKET_ERRORS as w --   SQL   , SQL              。 
SELECT @@SERVERNAME as w --    SQL     。 
SELECT @@SERVICENAME as w --  SQL             
SELECT @@TIMETICKS as w --  SQL           
SELECT @@TOTAL_ERRORS AS w --   SQL       ,       /    。 
SELECT @@TOTAL_READ as w --   SQL              。 
SELECT @@TOTAL_WRITE as w --  SQL              。 
SELECT @@TRANCOUNT as w --            。 
SELECT @@VERSION as w --  SQL        、        。 
이상 은 본문의 전체 내용 이 므 로 여러분 의 학습 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기