찾다
데이터 베이스MySQL 튜토리얼MSSQL之九 存储过程与函数

MSSQL之九 存储过程与函数

Jun 07, 2016 pm 02:49 PM
mssql기능저장개발하다데이터 베이스프로세스

作为数据库开发人员,你可能需要一起执行一系列SQL语句,SQL Sever允许你创建能一起执行的多个语句的批处理,批处理中可以包含控制流语句以及在执行语句之前检查条件的条件逻辑。 当你需要在不同时间重复的执行批处理时,可以把批处理保存为存储过程和函数的

作为数据库开发人员,你可能需要一起执行一系列SQL语句,SQL Sever允许你创建能一起执行的多个语句的批处理,批处理中可以包含控制流语句以及在执行语句之前检查条件的条件逻辑。

当你需要在不同时间重复的执行批处理时,可以把批处理保存为存储过程和函数的数据库对象。这些数据库包含一个预编译的批处理,它可以不需要再编译而执行很多次。

本章解释如何创建批处理以执行多个SQL语句以及如何在SQL Sever2008实现存储过程和存储函数。

重点

 

?          实现批处理

?          实现存储过程

?          实现函数

预习功课

 

?        创建批处理

?        创建存储过程

?        创建带参数的存储过程

?        从存储过程返回值

?        创建标量、表值、内联表值函数

 

 

 

 

 

 创建批处理

 

 

批处理是一组一起提交给SQL  Sever执行的SQL语句。当执行批处理时SQL Sever将批处理的语句编译到一个称为执行计划的可执行单元。这样可以节省执行时间。

为了创建批处理,你可以写出多个SQL语句,后面在结尾跟着关键字Go,Go是一个命令,它指定批处理的结束。


使用变量

   创建批处理的时候,你需要在执行的时候保存一些临时值,为存储这些临时值你可以声明变量并且为它们指定值.

定义变量

  declare 变量名称 数据类型

给变量赋值

(1)  直接赋值

set 变量名称=值

(2)  从表中获得值

select 变量名称=值 from 表名

使用结构

If…else条件选择结构

   If 

    

  else

     

CASE结构

  CASE

  WHEN  THEN 

   [[WHEN    THEN ] […]]

   [ELSE  ]

 END

BEGIN…END语句块

  BEGIN

       

   END

WHILE循环结构

  WHILE

   BEGIN

       

      [BREAK]

      [CONTNUE]

      [SQL语句或程序块]

   END

 创建存储过程

 

 

什么是存储过程

   存储过程是为完成特定的功能而汇集在一起的一组SQL程序语句,经编译后存储在数据库中的SQL程序。

.

当创建存储过程时,需要确定存储过程的三个组成部分:

 (1)所有的输入参数以及传给调用者的输出参数。

 (2)被执行的针对数据库的操作语句,包括调用其他存储过程的语句。

 (3)返回给调用者的状态值,以指明调用是成功还是失败。

常用的系统存储过程 

定义不带参数存储过程的语法

  CREATE PROCEDURE  存储过程名

            AS            --注释:表示后面是存储过程要执行的语句

            SQL语句

    GO

?       定义带参数存储过程的语法

  CREATE PROCEDURE  存储过程名

              @参数1  数据类型[ = 默认值 OUTPUT],

               …… ,

              @参数n  数据类型[ = 默认值 OUTPUT]

            AS            --注释:表示后面是存储过程要执行的语句

            SQL语句

    GO

OUTPUT:指定存储过程必须返回一个参数.该存储过程的匹配参数也必须由关键字OUTPUT创建.使用游标变量作为参数时使用该关键字.

【例9-1】创一个存储过程,以简化对sc表的数据添加工作,使得在执行该存储过程时,其参数值作为数据添加到表中。

程序清单如下:

CREATE  PROCEDURE [dbo].[ pr1_sc_ins]

@Param1 char(10),@Param2char(2),@Param3 real

AS

BEGIN

      insert into sc(sno,cno,score) values(@Param1,@Param2,@Param3)

END

【例9-2】创建一个带有参数的简单存储过程,从视图中返回指定的雇员(提供名和姓)及其职务和部门名称,该存储过程接受与传递的参数精确匹配的值

程序清单如下。

USE AdventureWorks;

GO

CREATE  PROCEDURE GetEmployees

    @lastname varchar(40),

    @firstname varchar(20)

AS

    SELECT LastName, FirstName, JobTitle,Department

    FROM HumanResources.vEmployeeDepartment

    WHERE FirstName = @firstname AND LastName =@lastname;

GO

 

?       调用存储过程语法

EXEC   PROCEDURE 存储过程名

  【例9-3】执行存储过程au_infor_all。

au_infor_all 存储过程可以通过以下方法执行:

EXECUTE(EXEC) au_infor_all

【例9-4】使用 EXECUTE 命令传递参数,执行例9-1定义的存储过程pr1_sc_ins。

sc_ins存储过程可以通过以下方法执行:

EXEC pr1_sc_ins ‘3130040101’,’c1’,85

当然,在执行过程中变量可以显式命名:

EXEC sc_ins @Param1=’ 3130040101’,@Param2=’c1’,@Param3=85

【例9-5】 执行例9-2定义的存储过程GetEmployees。

GetEmployees存储过程可以通过以下方法执行:

EXECUTE(EXEC) GetEmployees'Dull', 'Ann'  或者

EXECUTE(EXEC) GetEmployees@lastname = 'Dull', @firstname = 'Ann'  或者

EXECUTE(EXEC) GetEmployees@firstname = 'Ann', @lastname = 'Dull'

修改存储过程


重命名存储过程

      例: 把存储名称p_name修改为 p-address

        EXEC sp_rename ‘p_name’,’p_address’

 删除存储过程

      例: 删除存储过程p_name

          DROP  PROCEDURE p_name

 实现函数

 

 

你可以创建函数来永久存储一系列SQL语句,根据函数返回值形式的不同,用户定义的函数有标量函数和表值函数.

?       创建函数的语法:

CreateFunction[schema_name] function_name

([{@parameter_name[AS][type_schema_name.]

  parameter_data_type

  [=default] }

  [,…n ]

 ]

 )

Returnsreturn_data_type

[WIIH[,…n] ]

[AS]

BEGIN

function_body

        return expression

END

 

@parameter_name 是在函数中的参数.可以有一个或多个被声明的参数.

[typr_schema_name] parameter_data_type 是参数的数据类型,和可选的它的所属的模式.

[=default] 是参数的默认值.

return_data_type 是一个标量的用户定义函数的返回值.

function body 指定一系列T-SQL语句.

?       创建标量函数

标量函数接受一个参数并且返回在RETURNS从句中指定的类型的一个数据值。标量函数可以返回除了文本、ntext、图片、光标和时间戳之外的任何数据类型。有些标量函数,例如current_timestamp,不需要任何参数。

语法

create function 函数名(@变量名1 数据类型)

returns 返回值的数据类型

as

begin

 declare @变量名2 数据类型

 select @变量名2=sum(列名) from 表名1 where 主键名=@变量2

 return @变量名2

end

 

select 函数名(主键名) from 表名2

例如:

     CREATE FUNCTION HumanResources.MonthlySal  (@PayRate float)

     RETURNS float

     AS

     BEGIN

     RETURN (@PayRate * 8 * 30)

     END

例如:

     DECLARE @PayRate float

     SET @PauRate = HumanResources.MonthlySal(12.25)

     PRINT @PauRate

注释:上述代码中,@PayRate是一个变量,它将存储MonthlySal函数返回的值。

创建表值函数

内联表值函数从一个SELECT语句的结果集返回一个表数据的变量。内联函数不再BEGIN和END语句中包含函数体。

例子1:

  Create function fx_Department_name(@grnamenavarchar(20))

  Return table

As

Return(

Select *

FromHumanResources.Department

WhereGroupName=@grname

)

GO

这里的内联表,接收一组名称作为参数并且饭回来自Department表属于组的部门的详情。

使用 SELECT*FROM fx_Department_name 可以查看上述代码的输出。

多语句表值函数 

多语句表值函数使用多个语句来创建表,它被返回给调用语句。函数体包含BEGIN.。。。END块,它保存一系列T-SQL语句以创建和插入行盗临时表。临时表被在结果集中返回,并且基于函数中提到的规范创建。

语法:

create  function 函数名(@变量名1 数据类型)

returns @变量名2 table

(

  和创建表中的内容一样

)

as

begin

 insert @变量名2 select表中的列名 from  表名 ----指把表中的内容加到新创建的函数表中

 where 表中的另一个列名>@变量名1

  insert @变量名2values(.......)

end

select * from 函数名(表中的另一个列中的内容)

 

 

例如:

    CREATE  FUNCTION PayRate (@rate money)

    RETURNS  @table TABLE

   (EmployeeID  int  NOT NULL,

   RateChangeDate  datetime  NOT NULL,

    Ratemoney  NOT NULL,

   PayFrequency  tinyint  NOT NULL,

   ModifiedDate  datetime  NOTNULL)

    AS

    BEGIN

    INSERT@table

    SELECT *

    FROMHumanResources.EmployeePayHistory

    WHERE Rate> @rate

    RETURN

    END

语句:

    SELECT *FROM PayRate(45)

注释:

     函数以在函数内创建的临时表@table,的形式返回一个结果集。以上的语句执行函数。

 

 

 

 

                                                                                     

实践问题

 

1、批处理的用途是什么?

2、在批处理中本地变量的范围是什么?

3、存储过程如何返回值?

4、下面的哪个结构被使用,当你需要重复执行一系列T-SQL语句的时候?

   A、try – catch块

   B、while语句

   C、if-else语句

   D、case语句

 

小结

 

1、批处理是一系列一起提交到服务器执行的SQL语句。

2、你可以使用变量存储一个临时值。

3、你可以使用print语句来在屏幕上显示一个变量的内容。

4、你可以在批处理中使用注释给代码写注释。

5、你可以使用 if –else语句从条件执行SQL语句。

6、CASE语句求一系列条件的值并且返回各种可能结果中的一个。

7、你可以在批处理中使用WHILE语句以允许一系列T-SQL语句重复执行,只要给定条件为真。

8、BREAK语句导致从WHILE循环中退出。

9、存储过程是各种T-SQL语句的集合,它被存储在一个名字下,并且作为一个单元执行。

10、存储过程可以使用CREATE PROCEDURE语句创建。

11、存储过程允许你声明参数、变量和使用T-SQL语句并且编程逻辑。

12、存储过程提供更好的性能、安全性和准确性并且减少网络拥塞

13、存储过程通过输入参数接受数据。

14、存储过程通过输出参数或返回语句返回数据。

15、存储过程可以使用EXECUTE语句执行。

16、存储过程使用alter procedute语句执行修改

17、用户定函数是一个数据库对象,它包含一系列T-SQL语句。

18、用户定义函数可以返回一个单一标量值或结果集。
성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
MySQL에 사용자 추가 : 완전한 튜토리얼MySQL에 사용자 추가 : 완전한 튜토리얼May 12, 2025 am 12:14 AM

MySQL 사용자를 추가하는 방법을 마스터하는 것은 데이터베이스 관리자 및 개발자가 데이터베이스의 보안 및 액세스 제어를 보장하기 때문에 데이터베이스 관리자 및 개발자에게 중요합니다. 1) CreateUser 명령을 사용하여 새 사용자를 만듭니다. 2) 보조금 명령을 통해 권한 할당, 3) FlushPrivileges를 사용하여 권한이 적용되도록하십시오.

MySQL 문자열 데이터 유형 마스터 링 : Varchar vs. Text vs. CharMySQL 문자열 데이터 유형 마스터 링 : Varchar vs. Text vs. CharMay 12, 2025 am 12:12 AM

ChooseCharfixed-lengthdata, varcharforvariable-lengthdata, andtextforlargetextfields.1) charisefficientsconsentent-lengthdatalikecodes.2) varcharsuitsvariable-lengthdatalikeNames, 밸런싱 플렉스 및 성능

MySQL : 문자열 데이터 유형 및 인덱싱 : 모범 사례MySQL : 문자열 데이터 유형 및 인덱싱 : 모범 사례May 12, 2025 am 12:11 AM

MySQL에서 문자열 데이터 유형 및 인덱스를 처리하기위한 모범 사례는 다음과 같습니다. 1) 고정 길이의 Char, 가변 길이의 Varchar 및 큰 텍스트의 텍스트와 같은 적절한 문자열 유형 선택; 2) 인덱싱에 신중하고, 과도한 인덱싱을 피하고, 공통 쿼리에 대한 인덱스를 만듭니다. 3) 접두사 인덱스 및 전체 텍스트 인덱스를 사용하여 긴 문자열 검색을 최적화합니다. 4) 인덱스를 작고 효율적으로 유지하기 위해 인덱스를 정기적으로 모니터링하고 최적화합니다. 이러한 방법을 통해 읽기 및 쓰기 성능의 균형을 맞추고 데이터베이스 효율성을 향상시킬 수 있습니다.

MySQL : 원격으로 사용자를 추가하는 방법MySQL : 원격으로 사용자를 추가하는 방법May 12, 2025 am 12:10 AM

Toaddauserremotelytomysql, 다음에 따르면 : 1) 1) ConnectTomysqlasRoot, 2) CreateEnewerwitHremoteAccess, 3) GrantNecessaryPrivileges 및 4) FlushPrivileges

MySQL 문자열 데이터 유형에 대한 최고의 안내서 : 효율적인 데이터 저장MySQL 문자열 데이터 유형에 대한 최고의 안내서 : 효율적인 데이터 저장May 12, 2025 am 12:05 AM

tostorestringsefficiallyInmysql, choOseTherightDatAtypeBasedOnyOURNEDS : 1) USECHARFIXED-lengthstringsLikeCountryCodes.2) UseVarCharForVariable-lengthstringsLikenames.3) USETEXTFORLONG-FORMTEXTCONTENT.4) USETEXTFORLONG-FORMTEXTCONTENT.4) USETLOBFORBINARYIMAGES

MySQL Blob 대 텍스트 : 큰 개체에 대한 올바른 데이터 유형 선택MySQL Blob 대 텍스트 : 큰 개체에 대한 올바른 데이터 유형 선택May 11, 2025 am 12:13 AM

MySQL의 블로브 및 텍스트 데이터 유형을 선택할 때 Blob은 이진 데이터를 저장하는 데 적합하며 텍스트는 텍스트 데이터를 저장하는 데 적합합니다. 1) Blob은 그림 및 오디오와 같은 이진 데이터에 적합합니다. 2) 텍스트는 기사 및 주석과 같은 텍스트 데이터에 적합합니다. 선택할 때는 데이터 속성 및 성능 최적화를 고려해야합니다.

MySQL : 내 제품에 루트 사용자를 사용해야합니까?MySQL : 내 제품에 루트 사용자를 사용해야합니까?May 11, 2025 am 12:11 AM

아니요, youshouthusTherootUserInmysqlforyOUrProduct.instead, createScificuserswithlimitedPrivilegestoEnhancesecurity 및 forcuments : 1) grantOnlySerypermissionStothisUser, 3) 정기적으로 재구성 한 사람들이 관리자입니다

MySQL 문자열 데이터 유형 설명 : 데이터에 대한 올바른 유형 선택MySQL 문자열 데이터 유형 설명 : 데이터에 대한 올바른 유형 선택May 11, 2025 am 12:10 AM

mysqlstringdatatatypess는 Bechosenbeasedondatacharacteristicsandusecases : 1) Usecharfixed-lengthstringslikecountryCodes.2) UseVarCharforVariable-lengthstringslikenames.3) UseBaryBarBarBaryBinaryDatalikeCryPyps.4) Usebortextforlargeuns

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경