`
jveqi
  • 浏览: 323970 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SQLSERVER 存储过程 语法 (转)

    博客分类:
  • sql
 
阅读更多

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,'男'

 

本文来自CSDN博客,转载请标明出处:http://www.cnblogs.com/blsong/archive/2009/11/27/1612052.html

分享到:
评论

相关推荐

    oracle到sqlserver存储过程语法转换

    ### Oracle到SQL Server存储过程语法转换详解 在数据库迁移项目中,从Oracle迁移到SQL Server是一种常见的场景。本文旨在提供一份详细的指南,帮助开发者更好地理解这两种数据库系统在存储过程方面的语法差异,并...

    SQL Server存储过程基本语法

    ### SQL Server 存储过程基本语法知识点解析 #### 一、定义变量 在 SQL Server 中,我们可以使用 `DECLARE` 语句来定义变量,并通过 `SET` 或 `SELECT` 来给变量赋值。 ##### 1. 简单赋值 ```sql DECLARE @a int; ...

    SQLSERVER 存储过程 语法

    本文将深入解析SQL Server存储过程的创建、参数传递、事务管理、条件判断以及游标使用的语法细节。 #### 创建存储过程 存储过程的基本语法如下: ```sql CREATE PROCEDURE 存储过程名称 @参数1 数据类型, @参数...

    SQL server存储过程语法及实例

    SQL Server存储过程是SQL Server中为了完成特定功能的SQL语句集,可以看作是一个或多个SQL语句的封装,用于实现特定的业务逻辑或功能,可以包含逻辑控制、数据处理等代码。存储过程可以简化复杂的操作、增强性能、...

    SQLserver存储过程语法及实例

    接下来,将详细介绍SQL Server存储过程的关键语法和实例。 1. 创建存储过程的基本语法 存储过程通常使用CREATE PROCEDURE语句来创建。这里是一个简单的创建存储过程的示例: ```sql CREATE PROCEDURE sp_name AS ...

    SQL_server存储过程语法及实例

    SQL_server 存储过程语法及实例 创建存储过程 删除存储过程

    SQL_Server_vs_Oracle_存储过程语法转换

    标题与描述中的核心知识点是关于SQL Server与Oracle数据库在存储过程语法上的差异,这涉及到数据库管理系统(DBMS)的特定功能和语法结构。以下是对这些差异的详细解释: ### SQL Server与Oracle存储过程语法转换关键...

    Sql Server 存储过程的导出导入.doc

    在SQL Server中,存储过程是一种预编译的SQL语句集合,它允许开发人员封装一组复杂的操作,并在需要时重复调用。存储过程对于数据库管理、数据处理和性能优化具有重要意义。本文主要介绍如何在SQL Server中导出和...

    sqlserver存储过程语法及实例

    SQL Server 存储过程语法及实例 SQL Server 存储过程是一种 powerful 的数据库对象,它可以封装复杂的业务逻辑,并且提供了高效、安全和灵活的方式来管理数据。存储过程可以看作是一种特殊的函数,它可以接受输入...

    (完整版)SQLServer存储过程的基本概念以及语法汇总.docx

    SQL Server 存储过程的基本概念和语法汇总 存储过程是 SQL Server 中的一种重要概念,它可以将一些固定的操作集中起来由 SQL Server 数据库服务器来完成,以实现某个任务。存储过程是 SQL 语句和可选控制流语句的预...

    sqlserver存储过程语法详解

    在本文中,我们将深入探讨SQLServer存储过程的语法和调用方式。 首先,存储过程可以分为不同类别,基于它们是否返回记录集、是否有输入和输出参数。例如,一个简单的存储过程`getUserList`仅返回一个记录集,而`...

    SQL server存储过程习题,SQL触发器习题.rar

    在SQL Server数据库管理系统中,存储过程和触发器是两种非常重要的数据库编程元素,它们对于数据库设计和数据管理具有深远的影响。下面将详细讲解这两个概念及其相关的知识点。 **SQL存储过程**: 1. **定义**:SQL...

    vs中断点测试sqlserver的存储过程

    下面,我们将详细探讨如何在Visual Studio(以下简称VS)环境中进行SQL Server存储过程的中断点测试。 ### 一、准备工作:创建VS项目 在进行中断点测试前,首先需要在VS中创建一个新的项目。这一步骤是基础,确保...

    sqlserver sql语法大全

    ### SQLServer SQL语法大全 #### 创建数据库 在SQL Server中创建数据库是一项基本操作,通过`CREATE DATABASE`命令来实现。创建数据库时可以指定文件和日志文件的位置、初始大小及增长方式等参数。 **语法示例:**...

    SQL Server 和 MySql 语法和关键字的区别——用于SQLServer到MySql的转换

    SQL Server 和 MySql 语法和关键字的区别——用于 SQLServer 到 MySql 的转换 SQL Server 和 MySql 是两种常用的关系型数据库管理系统,但是它们之间存在一定的语法和关键字差异。这些差异使得开发者在从 SQL ...

    ORACLE和SQL Server的语法区别

    ### ORACLE和SQL Server的语法区别 #### 一、概述 本文主要介绍Oracle与SQL Server在SQL语言层面的异同之处,重点在于Transact-SQL(T-SQL)与PL/SQL之间的区别,并提供了一些迁移策略。对于希望将现有的Oracle...

    SQL Server中存储过程比直接运行SQL语句慢的原因

    在SQL Server中,存储过程被认为是一种提升性能和...理解这些问题并应用适当的优化技术是确保SQL Server存储过程高效运行的关键。正确设计和优化的存储过程可以极大地提高数据库的性能,并促进代码的可维护性和安全性。

    sql server 2008 存储过程与储发器 详解 书籍

    在SQL Server 2008中,存储过程和触发器是数据库管理中不可或缺的重要组成部分,它们为数据库系统提供了更高级别的功能和控制。本篇将深入解析这两个概念及其在实际应用中的具体用法。 首先,存储过程是预编译的SQL...

    sqlserver存储过程生成器

    SQL Server存储过程生成器是一种工具,它旨在帮助数据库管理员和开发人员更轻松、高效地创建和管理存储过程。存储过程是预编译的SQL代码集合,可以在SQL Server中执行,提供了一种组织和重用代码的方式,提高了应用...

    SQL Server 存储过程与实例

    以下是关于SQL Server存储过程的详细说明: 1. **存储过程的概念** 存储过程Procedure是一系列SQL语句的集合,它们在数据库中以编译好的形式存储,当需要执行时,只需要调用存储过程的名称并传入相应的参数。存储...

Global site tag (gtag.js) - Google Analytics