搜尋
首頁資料庫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)通過GRANT命令分配權限,3)使用FLUSHPRIVILEGES確保權限生效,4)定期審計和清理用戶賬戶以維護性能和安全。

掌握mySQL字符串數據類型:varchar vs.文本與char掌握mySQL字符串數據類型:varchar vs.文本與charMay 12, 2025 am 12:12 AM

chosecharforfixed-lengthdata,varcharforvariable-lengthdata,andtextforlargetextfield.1)chariseffity forconsistent-lengthdatalikecodes.2)varcharsuitsvariable-lengthdatalikenames,ballancingflexibilitibility andperformance.3)

MySQL:字符串數據類型和索引:最佳實踐MySQL:字符串數據類型和索引:最佳實踐May 12, 2025 am 12:11 AM

在MySQL中處理字符串數據類型和索引的最佳實踐包括:1)選擇合適的字符串類型,如CHAR用於固定長度,VARCHAR用於可變長度,TEXT用於大文本;2)謹慎索引,避免過度索引,針對常用查詢創建索引;3)使用前綴索引和全文索引優化長字符串搜索;4)定期監控和優化索引,保持索引小巧高效。通過這些方法,可以在讀取和寫入性能之間取得平衡,提升數據庫效率。

mysql:如何遠程添加用戶mysql:如何遠程添加用戶May 12, 2025 am 12:10 AM

ToaddauserremotelytoMySQL,followthesesteps:1)ConnecttoMySQLasroot,2)Createanewuserwithremoteaccess,3)Grantnecessaryprivileges,and4)Flushprivileges.BecautiousofsecurityrisksbylimitingprivilegesandaccesstospecificIPs,ensuringstrongpasswords,andmonitori

MySQL字符串數據類型的最終指南:有效的數據存儲MySQL字符串數據類型的最終指南:有效的數據存儲May 12, 2025 am 12:05 AM

tostorestringsefliceflicyInmySql,ChooSetherightDataTypeBasedyOrneOrneEds:1)USEcharforFixed-LengthStstringStringStringSlikeCountryCodes.2)UseVarcharforvariable-lengtthslikenames.3)USETEXTCONTENT.3)

mysql blob vs.文本:為大對象選擇正確的數據類型mysql blob vs.文本:為大對象選擇正確的數據類型May 11, 2025 am 12:13 AM

選擇MySQL的BLOB和TEXT數據類型時,BLOB適合存儲二進制數據,TEXT適合存儲文本數據。 1)BLOB適用於圖片、音頻等二進制數據,2)TEXT適用於文章、評論等文本數據,選擇時需考慮數據性質和性能優化。

MySQL:字符串數據類型可用哪些字符集?MySQL:字符串數據類型可用哪些字符集?May 10, 2025 am 12:07 AM

mysqloffersvariouscharactersetsforstringdatatypes:1)latin1 forwesterneuropeanlanguages,2)utf8 formultingualsupport,3)utf8mb4f OREXTEDENDENDENENICODECLUDINGEMOJIS,4)UCS2FORIXED-WIDTHENCODING,5)assiiforbasiclatin.ChoosideStherightStetSetensensersdaintegrity

mysql:斑點流比存儲它們更好嗎?mysql:斑點流比存儲它們更好嗎?May 10, 2025 am 12:06 AM

流式傳輸BLOB確實比直接存儲更好,因為它能減少內存使用和提高性能。 1)通過逐步讀取和處理文件,避免了數據庫膨脹和性能下降。 2)流式傳輸需要更複雜的代碼邏輯,且可能增加I/O操作次數。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境