SQLSERVER 存储过程 语法

SQLSERVER 存储过程 语法SQLSERVER存儲過程的寫法格式規格CodehighlightingproducedbyActiproCodeHighlighter(freeware)http://www.CodeHighlighter.com/–>******************************************************** author:Susan*** date:

大家好,又见面了,我是你们的朋友全栈君。

SQLSERVER存儲過程的寫法格式規格
*****************************************************


***
 author:Susan


***
 date:
2005
/
08
/
05


***
 expliation:如何寫存儲過程的格式及例子,有游標的用法!


***
 本版:SQL SERVER 版!


******************************************************/

在存儲過程中的格式規格:


CREATE
 
PROCEDURE
 XXX


/*

列舉傳入參數

1:名稱,2:類型,包括長度

Eg:@strUNIT_CODE varCHAR(3)


*/

參數1,

參數2……………


As


/*

定義內部參數

1:名稱,2:類型,包括長度

Eg:@strUNIT_CODE varCHAR(3)


*/


Declare

參數1,

參數2……………


/*

初始化內部參數

Eg:SET @strUNIT_CODE=’’


*/

Set參數1的初始值

Set參數2的初始值…………


/*

過程的主內容區

Trascation:這裡起到的作用是,如果他中間的任何一個執行錯誤,就全部執行都返回,這裡sql sever 7.0以前一定要寫入,以後的就可以省略

Return:結束這支sp


*/


Begin
 trascation

    
/*

        1:可以取得需要的值以存在內部參數中

     Eg:SELECT @strUNIT_CODE=UNIT_CODE FROM UNIT WHERE …….

2:可以用取到的或傳入的參數進行判斷,來進行update,insert,delete 等等操作

eg: IF @strUNIT_CODE=’’

         BEGIN

     //具體的操作

End

Else

Begin

    //具體的操作

End

 3:有關游標的問題

     Eg:

        declare db cursor for       //聲明一個游標(db為其名稱)

        SELECT UNIT_NAME FROM UNIT WHERE LEFT(UNIT_CODE,2)=LEFT(@strTO,2)//記錄集

        open db                 //打開游標

            fetch next from db into @strUNIT_NAME //將第一個值放入一個參數中

        while @@fetch_status = 0 —存在本筆值向下循環

(0:順利執行;-1:失敗,或資料列超出結果集;-2:擷取的資料列已遺漏)

        BEGIN             —-開始循環

                        //個體操作

        End                —-結束循環

        Close db            —關閉游標

deallocate db         //移除資料指標參考


*/


Commit
 trascation


Return

 

下面是一個例子


CREATE
 
PROCEDURE
 TEST_2


@strTO
 
VARCHAR
(
3
)


AS


DECLARE

 
@strUNIT_NAME
 
VARCHAR
(
800
),

 
@strSQL
 
VARCHAR
(
8000
),

 
@Link
 
VARCHAR
(
1
),

 
@Link1
 
VARCHAR
(
1
)

 


SET
 
@strUNIT_NAME
=


SET
 
@strSQL
=


SET
 
@Link
=


SET
 
@Link1
=

 


/*

處理update 的部分

EXEC TEST_2 ‘011’

EXEC TEST_2 ”

SELECT UNIT_NAME FROM UNIT WHERE UNIT_CODE=’011′


*/


BEGIN
 
TRANSACTION
                                       

         
IF
 
@strTO
<>

        
BEGIN

                
UPDATE
 UNIT 
SET
 UNIT_NAME
=
REPLACE
(UNIT_NAME,

*

,


WHERE
 UNIT_CODE
=
@strTO

        
END

             
ELSE

        
BEGIN

                
UPDATE
 UNIT 
SET
 UNIT_NAME
=
UNIT_NAME
+

*

 
WHERE
 UNIT_CODE
=

011

        
END


/*

EXEC TEST_2 ‘011’

功能說明:本sp用於處理cursor問題


*/

        
IF
   
@strTO
<>

            
BEGIN

                        
declare
 db 
cursor
 
for
                                                

必需聲明在查詢的前面



                

SELECT
 UNIT_NAME 
FROM
 UNIT 
WHERE
 
LEFT
(UNIT_CODE,
2
)
=
LEFT
(
@strTO
,
2
)

-取到相關信息



            

END

        
ELSE

            
BEGIN

                     
declare
 db 
cursor
 
for
                                              

必需聲明在查詢的前面



                     

SELECT
 UNIT_NAME 
FROM
 UNIT 
WHERE
 
LEFT
(UNIT_CODE,
2
)
=
LEFT
(

011

,
2
)

-取到相關信息



            

END

        
open
 db                                                    

-開起取到的信息



        

fetch
 
next
 
from
 db 
into
 
@strUNIT_NAME
        

-把第一筆放入@strUNIT_NAME中



        

while
 
@@fetch_status
 
=
 
0
                                           

-表示存在本筆資料



        

BEGIN
                                                    

–開始循環



                

set
 
@strSQL
 
=
@strSQL
+
@Link1
+
@Link
+
 
@strUNIT_NAME
 

–設定保存的值



                

fetch
 
next
 
from
 db 
into
 
@strUNIT_NAME
                       

–進行下次循環



                

SET
 
@Link
=
CHAR
(
13

+
CHAR
(
10
)

                
SET
 
@Link1
=

,

        
END
                                                        

–結束循環



        

close
 db                                                   

-關閉信息



        

deallocate
 db                                            

-移除資料指標參考




SELECT
 
@strSQL


COMMIT
 
TRANSACTION


RETURN

如果循环insert的例子

DECLARE
 
@strLoginID
 
VARCHAR
(
16
)

BEGIN


declare
 db 
cursor
 
for


SELECT
 LoginID 
FROM
 dbo.s_Users 
WHERE
 
len
(UnitCoding) 
in
(
9
,
12
)

END


open
 db

fetch
 
next
 
from
 db 
into
 
@strLoginID


while
 
@@fetch_status
 
=
 
0
 
BEGIN


insert
 
into
 s_P_User

select
 
@strLoginID
,LevelID 
from
 s_P_User 
where
 LoginID 
=
 

aa



fetch
 
next
 
from
 db 
into
 
@strLoginID


END


close
 db

deallocate
 db

一、TRUNCATE

二、Select INTO 建表

    把一个表中的数据复制到另外一个表中。

三、Insert INTO Select

四、补充:临时表

    临时表存储在系统数据库tempdb中

    临时表会被系统隐式地丢弃

———————————————————

五、存储过程(**)

    一、简介:

    

   存储过程(Stored Procedure), 是一组为了完成特定功能的SQL 语句,集经编译后

    存储在数据库中,用户通过指定存储过程的名字并给出参数,如果该存储过程带有参数来执行

它,

    在SQL Server 的系列版本中,存储过程分为两类:系统提供的存储过程和用户自定义存储过程



    系统SP,主要存储master 数据库中,并以sp_为前缀并且系统存储过程主要是从系统表中获取

    信息,从而为系统管理员管理SQL Server。 用户自定义存储过程是由用户创建,并能完成

    某一特定功能,如:查询用户所需数据信息的存储过程。

    

      存储过程具有以下优点

    1.存储过程允许标准组件式编程(模块化设计)

    存储过程在被创建以后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句,而

且数

    据库专业人员可随时对存储过程进行修改,但对应用程序源代码毫无影响。因为应用程序源代

码只包含存

    储过程的调用语句,从而极大地提高了程序的可移植性。

            

    2.存储过程能够实现快速的执行速度

   如果某一操作包含大量的Transaction-SQL 代码,,或分别被多次执行,那么存储过程要比批处理



    执行速度快很多,因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进

行分析优

    化,并给出最终被存在系统表中的执行计划,而批处理的Transaction-SQL 语句在每次运行时

都要进行

    编译和优化,因此速度相对要慢一些。

                

    3.存储过程能够减少网络流量

   对于同一个针对数据数据库对象的操作,如查询修改,如果这一操作所涉及到的Transaction-SQL

    语句被组织成一存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调

用语句,否

    则将是多条SQL 语句从而大大增加了网络流量降低网络负载。

            

    4.存储过程可被作为一种安全机制来充分利用

   系统管理员通过,对执行某一存储过程的权限进行限制,从而能够实现对相应的数据访问权限的



    制。

    二、变量

    @I

    三、流程控制语句(if else | select case | while )

    Select … CASE 实例

    DECLARE @iRet INT, @PKDisp VARCHAR(20)

    SET @iRet = ‘1’

    Select @iRet =

    CASE

        WHEN @PKDisp = ‘一’ THEN 1

        WHEN @PKDisp = ‘二’ THEN 2

        WHEN @PKDisp = ‘三’ THEN 3

        WHEN @PKDisp = ‘四’ THEN 4

        WHEN @PKDisp = ‘五’ THEN 5

        ELSE 100

    END

    四、存储过程格式

        

    创建存储过程

    Create Proc dbo.存储过程名

    存储过程参数

    AS

    执行语句

    RETURN

    执行存储过程

    GO

*********************************************************/


 变量的声明,sql里面声明变量时必须在变量前加@符号


    
DECLARE
 
@I
 
INT



 变量的赋值,变量赋值时变量前必须加set


    
SET
 
@I
 
=
 
30



 声明多个变量


    
DECLARE
 
@s
 
varchar
(
10
),
@a
 
INT



 Sql 里if语句


    
IF
 条件 
BEGIN

        执行语句
    

END

    

ELSE
 
BEGIN

        执行语句
    

END

            
    

DECLARE
 
@d
 
INT

    

set
 
@d
 
=
 
1

    
IF
 
@d
 
=
 
1
 
BEGIN

    

 打印


        
PRINT
 

正确


    

END

    

ELSE
 
BEGIN

        

PRINT
 

错误


    

END



 Sql 里的多条件选择语句.


    
DECLARE
 
@iRet
 
INT

@PKDisp
 
VARCHAR
(
20
)
    

SET
 
@iRet
 
=
 
1

    

Select
 
@iRet
 
=

    

CASE

        

WHEN
 
@PKDisp
 
=
 



 
THEN
 
1

        

WHEN
 
@PKDisp
 
=
 



 
THEN
 
2

        

WHEN
 
@PKDisp
 
=
 



 
THEN
 
3

        

WHEN
 
@PKDisp
 
=
 



 
THEN
 
4

        

WHEN
 
@PKDisp
 
=
 



 
THEN
 
5

        

ELSE
 
100

    

END



 循环语句


    
WHILE
 条件 
BEGIN
    
        执行语句
    

END

    
DECLARE
 
@i
 
INT

    

SET
 
@i
 
=
 
1

    

WHILE
 
@i
<
1000000
 
BEGIN

        

set
 
@i
=
@i
+
1

    

END

    


 打印


    
PRINT
 
@i



 TRUNCATE 删除表中的所有行,而不记录单个行删除操作,不能带条件



    

/*

    TRUNCATE TABLE 在功能上与不带 Where 子句的 Delete 语句相同:二者均删除表中的全部行

。但 TRUNCATE TABLE 比 Delete 速度快,且使用的系统和事务日志资源少。
    Delete 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过

释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
    TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用

的计数值重置为该列的种子。如果想保留标识计数值,请改用 Delete。如果要删除表定义及其数据,请

使用 Drop TABLE 语句。
    对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 Where 子句的

Delete 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。
    TRUNCATE TABLE 不能用于参与了索引视图的表。
    示例
        下例删除 authors 表中的所有数据。
*/

        
        

TRUNCATE
 
TABLE
 authors
                



 Select INTO 从一个查询的计算结果中创建一个新表。 数据并不返回给客户端,这一点和普通的


 Select 不同。 新表的字段具有和 Select 的输出字段相关联(相同)的名字和数据类型。


        
        

select
 
*
 
into
 NewTable
            

from
 Uname



 Insert INTO Select


        

 表ABC必须存在


        

 把表Uname里面的字段Username复制到表ABC


        
Insert
 
INTO
 ABC 
Select
 Username 
FROM
 Uname



 创建临时表


        
Create
 
TABLE
 #
temp
(
            UID 

int
 
identity
(
1

1

PRIMARY
 
KEY
,
            UserName 

varchar
(
16
),
            Pwd 

varchar
(
50
),
            Age 

smallint
,
            Sex 

varchar
(
6
)
        )
        


 打开临时表


        
Select
 
*
 
from
 #
temp



 存储过程


        

 要创建存储过程的数据库


        
Use
 Test
        


 判断要创建的存储过程名是否存在


            
if
 
Exists
(
Select
 name 
From
 sysobjects 
Where
 name
=

csp_AddInfo

 
And

type
=

P

)
            


 删除存储过程


            
Drop
 
Procedure
 dbo.csp_AddInfo
        

Go

                
                
        


 创建存储过程


        
Create
 
Proc
 dbo.csp_AddInfo
        


 存储过程参数


        
@UserName
 
varchar
(
16
),
        

@Pwd
 
varchar
(
50
),
        

@Age
 
smallint
,
        

@Sex
 
varchar
(
6
)
        

AS

        


 存储过程语句体


        
insert
 
into
 Uname (UserName,Pwd,Age,Sex)
            

values
 (
@UserName
,
@Pwd
,
@Age
,
@Sex
)
        

RETURN

        


 执行


        
GO

                
        


 执行存储过程


        
EXEC
 csp_AddInfo 

Junn.A

,

123456

,
20
,


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/160806.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月17日 上午11:00
下一篇 2022年7月17日 上午11:00


相关推荐

  • Ubuntu卸载软件:3种卸载方式

    Ubuntu卸载软件:3种卸载方式1.使用Synaptic软件包管理器进行卸载打开软件包管理器。Ubuntu自带了一个GUI(GraphicalUserInterface,图形化用户界面)软件包管理器,它可以让你在一个可视化窗口中卸载程序。如果你不习惯使用命令行,这一工具将非常有用。点击系统,然后选择管理。在管理菜单中,选择Synaptic软件包管理器。某些较新版本的Ubuntu没有预装Synaptic。要安装它,打…

    2022年5月7日
    691
  • 如何在docker容器中运行docker命令

    如何在docker容器中运行docker命令欢迎关注个人微信公众号:devopscube前言​Docker作为目前炙手可热的容器运行环境,越来越多的应用到应用的部署当中。这种一次打包,随处运行的模式备受好评,也节约了很多环境配置的麻烦。很多软件运行时都提供了docker的镜像部署方式,我们可以看到常用的组件,开源的项目,都会提供docker镜像,或者用于打包镜像的dockerfile。所以Docker已然成为了软件…

    2022年5月17日
    164
  • Qt Creator 安装 VLD

    Qt Creator 安装 VLD一 环境说明 1 VLD nbsp 内存检测工具 只能检测使用 VC 编译器 不能用于检测 MinGW 编译器 nbsp nbsp 所以要检测 nbsp Qt 内存泄露问题编译器一定要是 MSVC 环境要求 nbsp 1 VLD nbsp 版本要 2 X 以上 nbsp 不能使用 1 X 的版本 否则检测不准确 Qt 检测会提示很多内存泄露 本人使用 vld 2 3 setup exe nbsp 2 VC 编译器 nbsp 即 MSVC nbsp 如果有安装 VS 则就有这编译器 nbsp

    2025年12月6日
    5
  • [套图]关于爱情_恋爱图

    [套图]关于爱情_恋爱图 .com  分享最最可爱的互联网 喜欢这套图,看起来很温和   ByEasy

    2025年11月18日
    4
  • 向量范数与矩阵范数的理解题_矩阵范数的性质

    向量范数与矩阵范数的理解题_矩阵范数的性质要更好的理解范数,就要从函数、几何与矩阵的角度去理解,我尽量讲的通俗一些。我们都知道,函数与几何图形往往是有对应的关系,这个很好想象,特别是在三维以下的空间内,函数是几何图像的数学概括,而几何图像是函数的高度形象化,比如一个函数对应几何空间上若干点组成的图形。但当函数与几何超出三维空间时,就难以获得较好的想象,于是就有了映射的概念,映射表达的就是一个集合通过某种关系转为另外一个集合。通常数学书是先…

    2026年1月20日
    3
  • LoadRunner11下载以及详细激活成功教程说明

    LoadRunner11下载以及详细激活成功教程说明http://blog.csdn.net/oyzl68/article/details/9973143前期准备:LoadRunner11下载请猛戳这里 传送门LoadRunner激活成功教程文件下载请猛戳这里 传送门LoadRunner注册表清理工具下载请猛戳这里 传送门LoadRunner11激活成功教程方法:一、覆盖激活成功教程文件首先请下载LoadRunner激活成功教程文件,

    2022年7月22日
    13

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号