61阅读

存储过程语法-SQLSERVER 存储过程 语法

发布时间:2017-08-10 所属栏目:计算机软件及应用

一 : SQLSERVER 存储过程 语法

SQLSERVER 存储过程 语法收藏

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 建表
    把一个表中的数据复制到另外一个表中。[www.61k.com)

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

二 : oceanbase中存储过程的实现(一)语法解析部分

技术背景[www.61k.com)

淘宝的开源数据库oceanbase 是一个支持海量数据的高性能分布式数据库系统,实现了数千亿条记录、数百TB数据上的跨行跨表事务,由淘宝核心系统研发部开发的。

但是现在oceanbase0.4版本是不支持很多功能的,其中包括存储过程。

开发方案

淘宝数据使用的是flex&bison来进行sql语句的解析的,因此我们在做存储过程的语法也应该用它的方案实现。

我们经过语法解析过后需要用一种数据结构来存储语法树,一种方法是使用OB里面的节点设计,另一种是使用Postgrepsql的节点设计来存储它

OceanBase的语法树的节点设计

OceanBase的语法树节点结构体也只有一个,该结构体包括一个枚举类型变量type_,和PostgreSQL一样,代表该结构体对应的类型。还有两组属性,对应终止符节点,只能使用vakue_和str_value_两个字段,分别对应64位整形值和字符串值;非终止符节点使用最后两个字段,num_child_表示子节点的个数,children_指向子节点数组的首地址。

oceanbase oceanbase中存储过程的实现(一)语法解析部分

存储过程语法树

oceanbase oceanbase中存储过程的实现(一)语法解析部分

上面部分是通过语法解析部分得到的一颗语法树。

三 : 存储过程写法

获取存储过程返回值及代码中获取返回值

1.OUPUT参数返回值

例: 向Order表插入一条记录,返回其标识

CREATE PROCEDURE [dbo].[nb_order_insert](

@o_buyerid int ,

@o_id bigint OUTPUT

)

AS

BEGIN

SET NOCOUNT ON;

BEGIN

INSERT INTO [Order](o_buyerid )

VALUES (@o_buyerid )

SET @o_id = @@IDENTITY

END

END

存储过程中获得方法:

DECLARE @o_buyerid int

DECLARE @o_id bigint

EXEC [nb_order_insert] @o_buyerid ,o_id bigint

2.RETURN过程返回值

CREATE PROCEDURE [dbo].[nb_order_insert](

@o_buyerid int ,

@o_id bigint OUTPUT

)

AS

BEGIN

SET NOCOUNT ON;

IF(EXISTS(SELECT * FROM [Shop] WHERE [s_id] = @o_shopid)) BEGIN

INSERT INTO [Order](o_buyerid )

VALUES (@o_buyerid )

SET @o_id = @@IDENTITY

RETURN 1 — 插入成功返回1

END

ELSE

RETURN 0 — 插入失败返回0

END

存储过程中的获取方法

DECLARE @o_buyerid int

DECLARE @o_id bigint

DECLARE @result bit

EXEC @result = [nb_order_insert] @o_buyerid ,o_id bigint

3.SELECT 数据集返回值

CREATE PROCEDURE [dbo].[nb_order_select](

@o_id int

)

AS

BEGIN

SET NOCOUNT ON;

SELECT o_id,o_buyerid FROM [Order]

WHERE o_id = @o_id

GO

存储过程中的获取方法

(1)、使用临时表的方法

CREATE TABLE [dbo].[Temp](

[o_id] [bigint] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,

[o_buyerid] [int] NOT NULL

)

INSERT [Temp] EXEC [nb_order_select] @o_id

– 这时 Temp 就是EXEC执行SELECT 后的结果集

SELECT * FROM [Temp]

DROP [Temp] — 删除临时表

(2)、速度不怎么样.(不推荐)

SELECT * from openrowset(’provider_name','Trusted_Connection=yes’,'exec nb_order_select’)

1.获取Return返回值

程序代码

//存储过程

//Create PROCEDURE MYSQL

// @a int,

// @b int

//AS

// return @a + @b

//GO

SqlConnection conn = new

SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString());

conn.Open();

SqlCommand MyCommand = new SqlCommand("MYSQL", conn);

MyCommand.CommandType = CommandType.StoredProcedure;

MyCommand.Parameters.Add(new SqlParameter("@a", SqlDbType.Int)); MyCommand.Parameters["@a"].Value = 10;

MyCommand.Parameters.Add(new SqlParameter("@b", SqlDbType.Int)); MyCommand.Parameters["@b"].Value = 20;

MyCommand.Parameters.Add(new SqlParameter("@return", SqlDbType.Int));

MyCommand.Parameters["@return"].Direction = ParameterDirection.ReturnValue; MyCommand.ExecuteNonQuery();

Response.Write(MyCommand.Parameters["@return"].Value.ToString());

2.获取Output输出参数值

程序代码

//存储过程

//Create PROCEDURE MYSQL

// @a int,

// @b int,

// @c int output

//AS

// Set @c = @a + @b

//GO

SqlConnection conn = new

SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString());

conn.Open();

SqlCommand MyCommand = new SqlCommand("MYSQL", conn);

MyCommand.CommandType = CommandType.StoredProcedure;

MyCommand.Parameters.Add(new SqlParameter("@a", SqlDbType.Int)); MyCommand.Parameters["@a"].Value = 20;

MyCommand.Parameters.Add(new SqlParameter("@b", SqlDbType.Int)); MyCommand.Parameters["@b"].Value = 20;

MyCommand.Parameters.Add(new SqlParameter("@c", SqlDbType.Int)); MyCommand.Parameters["@c"].Direction = ParameterDirection.Output;

MyCommand.ExecuteNonQuery();

Response.Write(MyCommand.Parameters["@c"].Value.ToString());

C#接收存储过程返回值:

public static int User_Add(User us)

{

int iRet;

SqlConnection conn = new SqlConnection(Conn_Str);

SqlCommand cmd = new SqlCommand("User_Add", conn); cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.AddWithValue("@UName", us.UName);

cmd.Parameters.AddWithValue("@UPass", us.UPass);

cmd.Parameters.AddWithValue("@PassQuestion", us.PassQuestion); cmd.Parameters.AddWithValue("@PassKey", us.PassKey);

cmd.Parameters.AddWithValue("@Email", us.Email);

cmd.Parameters.AddWithValue("@RName", us.RName);

cmd.Parameters.AddWithValue("@Area", us.Area);

cmd.Parameters.AddWithValue("@Address", us.Address);

cmd.Parameters.AddWithValue("@ZipCodes", us.ZipCodes); cmd.Parameters.AddWithValue("@Phone", us.Phone);

cmd.Parameters.AddWithValue("@QQ", us.QQ);

cmd.Parameters.Add("@RETURN_VALUE", "").Direction = ParameterDirection.ReturnValue;

try

{

conn.Open();

cmd.ExecuteNonQuery();

iRet = (int)cmd.Parameters["@RETURN_VALUE"].Value; }

catch (SqlException ex)

{

throw ex;

}

finally

{

conn.Close();

}

return iRet;

}

C#接收存储过程输出参数:

public static decimal Cart_UserAmount(int UID)

{

decimal iRet;

SqlConnection conn = new SqlConnection(Conn_Str);

SqlCommand cmd = new SqlCommand("Cart_UserAmount", conn); cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.AddWithValue("@UID", UID);

cmd.Parameters.Add("@Amount",

SqlDbType.Decimal).Direction=ParameterDirection.Output; try

{

conn.Open();

cmd.ExecuteNonQuery();

iRet = (decimal)cmd.Parameters["@Amount"].Value; }

catch (SqlException ex)

{

throw ex;

}

finally

{

conn.Close();

}

return iRet;

}

四 : 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

获取存储过程返回值及代码中获取返回值

parameters.add 存储过程写法

1.OUPUT参数返回值

例: 向Order表插入一条记录,返回其标识

CREATE PROCEDURE [dbo].[nb_order_insert](

@o_buyerid int ,

@o_id bigint OUTPUT

)

AS

BEGIN

SET NOCOUNT ON;

BEGIN

INSERT INTO [Order](o_buyerid )

VALUES (@o_buyerid )

SET @o_id = @@IDENTITY

END

END

存储过程中获得方法:

DECLARE @o_buyerid int

DECLARE @o_id bigint

EXEC [nb_order_insert] @o_buyerid ,o_id bigint

2.RETURN过程返回值

CREATE PROCEDURE [dbo].[nb_order_insert](

@o_buyerid int ,

@o_id bigint OUTPUT

)

AS

BEGIN

SET NOCOUNT ON;

IF(EXISTS(SELECT * FROM [Shop] WHERE [s_id] = @o_shopid)) BEGIN

INSERT INTO [Order](o_buyerid )

VALUES (@o_buyerid )

SET @o_id = @@IDENTITY

RETURN 1 — 插入成功返回1

END

ELSE

RETURN 0 — 插入失败返回0

END

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

parameters.add 存储过程写法

存储过程中的获取方法

DECLARE @o_buyerid int

DECLARE @o_id bigint

DECLARE @result bit

EXEC @result = [nb_order_insert] @o_buyerid ,o_id bigint

3.SELECT 数据集返回值

CREATE PROCEDURE [dbo].[nb_order_select](

@o_id int

)

AS

BEGIN

SET NOCOUNT ON;

SELECT o_id,o_buyerid FROM [Order]

WHERE o_id = @o_id

GO

存储过程中的获取方法

(1)、使用临时表的方法

CREATE TABLE [dbo].[Temp](

[o_id] [bigint] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,

[o_buyerid] [int] NOT NULL

)

INSERT [Temp] EXEC [nb_order_select] @o_id

– 这时 Temp 就是EXEC执行SELECT 后的结果集

SELECT * FROM [Temp]

DROP [Temp] — 删除临时表

(2)、速度不怎么样.(不推荐)

SELECT * from openrowset(’provider_name','Trusted_Connection=yes’,'exec nb_order_select’)

1.获取Return返回值

程序代码

//存储过程

//Create PROCEDURE MYSQL

// @a int,

parameters.add 存储过程写法

parameters.add 存储过程写法

// @b int

//AS

// return @a + @b

//GO

SqlConnection conn = new

SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString());

conn.Open();

SqlCommand MyCommand = new SqlCommand("MYSQL", conn);

MyCommand.CommandType = CommandType.StoredProcedure;

MyCommand.Parameters.Add(new SqlParameter("@a", SqlDbType.Int)); MyCommand.Parameters["@a"].Value = 10;

MyCommand.Parameters.Add(new SqlParameter("@b", SqlDbType.Int)); MyCommand.Parameters["@b"].Value = 20;

MyCommand.Parameters.Add(new SqlParameter("@return", SqlDbType.Int));

MyCommand.Parameters["@return"].Direction = ParameterDirection.ReturnValue; MyCommand.ExecuteNonQuery();

Response.Write(MyCommand.Parameters["@return"].Value.ToString());

2.获取Output输出参数值

程序代码

//存储过程

//Create PROCEDURE MYSQL

// @a int,

// @b int,

// @c int output

//AS

// Set @c = @a + @b

//GO

SqlConnection conn = new

SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString());

conn.Open();

SqlCommand MyCommand = new SqlCommand("MYSQL", conn);

MyCommand.CommandType = CommandType.StoredProcedure;

MyCommand.Parameters.Add(new SqlParameter("@a", SqlDbType.Int)); MyCommand.Parameters["@a"].Value = 20;

MyCommand.Parameters.Add(new SqlParameter("@b", SqlDbType.Int)); MyCommand.Parameters["@b"].Value = 20;

MyCommand.Parameters.Add(new SqlParameter("@c", SqlDbType.Int)); MyCommand.Parameters["@c"].Direction = ParameterDirection.Output;

MyCommand.ExecuteNonQuery();

Response.Write(MyCommand.Parameters["@c"].Value.ToString());

parameters.add 存储过程写法

C#接收存储过程返回值:

public static int User_Add(User us)

{

int iRet;

SqlConnection conn = new SqlConnection(Conn_Str);

SqlCommand cmd = new SqlCommand("User_Add", conn); cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.AddWithValue("@UName", us.UName);

cmd.Parameters.AddWithValue("@UPass", us.UPass);

cmd.Parameters.AddWithValue("@PassQuestion", us.PassQuestion); cmd.Parameters.AddWithValue("@PassKey", us.PassKey);

cmd.Parameters.AddWithValue("@Email", us.Email);

cmd.Parameters.AddWithValue("@RName", us.RName);

cmd.Parameters.AddWithValue("@Area", us.Area);

cmd.Parameters.AddWithValue("@Address", us.Address);

cmd.Parameters.AddWithValue("@ZipCodes", us.ZipCodes); cmd.Parameters.AddWithValue("@Phone", us.Phone);

cmd.Parameters.AddWithValue("@QQ", us.QQ);

cmd.Parameters.Add("@RETURN_VALUE", "").Direction = ParameterDirection.ReturnValue;

try

{

conn.Open();

cmd.ExecuteNonQuery();

iRet = (int)cmd.Parameters["@RETURN_VALUE"].Value; }

catch (SqlException ex)

{

throw ex;

}

finally

{

conn.Close();

}

return iRet;

}

C#接收存储过程输出参数:

public static decimal Cart_UserAmount(int UID)

{

decimal iRet;

parameters.add 存储过程写法

SqlConnection conn = new SqlConnection(Conn_Str);

SqlCommand cmd = new SqlCommand("Cart_UserAmount", conn); cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.AddWithValue("@UID", UID);

cmd.Parameters.Add("@Amount",

SqlDbType.Decimal).Direction=ParameterDirection.Output; try

{

conn.Open();

cmd.ExecuteNonQuery();

iRet = (decimal)cmd.Parameters["@Amount"].Value; }

catch (SqlException ex)

{

throw ex;

}

finally

{

conn.Close();

}

return iRet;

}

五 : SQLServer 存储过程简介与使用方法

Sql Server的存储过程是一个被命名的存储在服务器上的Transacation-Sql语句集合,是封装重复性工作的一种方法,它支持用户声明的变量、条件执行和其他强大的编程功能。

存储过程相对于其他的数据库访问方法有以下的优点:

(1)重复使用。存储过程可以重复使用,从而可以减少数据库开发人员的工作量。

(2)提高性能。存储过程在创建的时候就进行了编译,将来使用的时候不用再重新编译。一般的SQL语句每执行一次就需要编译一次,所以使用存储过程提高了效率。

(3)减少网络流量。存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低了网络传输的数据量。

(4)安全性。参数化的存储过程可以防止SQL注入式的攻击,而且可以将Grant、Deny以及Revoke权限应用于存储过程。

存储过程一共分为了三类:用户定义的存储过程、扩展存储过程以及系统存储过程。

其中,用户定义的存储过程又分为Transaction-SQL和CLR两种类型。

Transaction-SQL 存储过程是指保存的Transaction-SQL语句集合,可以接受和返回用户提供的参数。

CLR存储过程是指对.Net Framework公共语言运行时(CLR)方法的引用,可以接受和返回用户提供的参数。他们在.Net Framework程序集中是作为类的公共静态方法实现的。(本文就不作介绍了)

创建存储过程的语句如下:

以下为引用的内容:

CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number ] 
    
[ { @parameter [ type_schema_name. ] data_type } 
        
[ VARYING ] [ = default ] [ [ OUT [ PUT ] 
    ] 
[ ,n ] 
[ WITH <procedure_option> [ ,n ]
[ FOR REPLICATION ] 
AS { <sql_statement> [;][ n ] | <method_specifier> }
[;]
<procedure_option> ::= 
    
[ ENCRYPTION ]
    
[ RECOMPILE ]
    
[ EXECUTE_AS_Clause ]

<sql_statement> ::= 
[ BEGIN ] statements [ END ] }

<method_specifier> ::=
EXTERNAL NAME assembly_name.class_name.method_name

     [schema_name]: 代表的是存储过程所属的架构的名称

      例如:

            Create Schema yangyang8848     
            Go
            Create Proc yangyang8848.AllGoods
            As Select * From Master_Goods
            Go

            执行:Exec AllGoods 发生错误。

            执行:Exec yangyang8848.AllGoods 正确执行。

      [;Number]: 用于对同名过程进行分组的可选整数。使用一个 DROP PROCEDURE 语句可将这些分组过程一起删除。

      例如:

            Create Proc S1 ;1
            AS
                   Select * From Master_Goods
            Go
            Create Proc S1 ;2
            As
                   Select * From Master_Location
            Go

            创建完毕了两个存储过程。它们在同一个组S1里,如果执行Exec S1 则存储过程默认执行 Exec S1 ;1 。如果我们想得到所有据点信息则需要执行Exec S1 ;2。当我们要删除存储过程的时候,只能执行Drop Exec S1 则该组内所有的存储过程被删除。

      [@ parameter]: 存储过程中的参数,除非将参数定义的时候有默认值或者将参数设置为等于另一个参数,否则用户必须在调用存储过程的时候为参数赋值。

      存储过程最多有2100个参数。

      例如:

      Create Proc yangyang8848.OneGoods
      @GoodsCode varchar(10)
      As
             Select * From Master_Goods Where GoodsCode = @GoodsCode
      Go

      调用的代码:

      Declare @Code varchar(10)
      Set @Code = '0004'
      Exec yangyang8848.OneGoods @Code

      在参数的后边加入Output 表明该参数为输出参数。

      Create Proc yangyang8848.OneGoods
      @GoodsCode2 varchar(10) output,@GoodsCode varchar(10) = '0011'
      As
             Select * From Master_Goods Where GoodsCode = @GoodsCode
             Set @GoodsCode2 = '0005'
      Go

      调用方法:
      Declare @VV2 varchar(10)
      Exec yangyang8848.OneGoods  @Code out

      注意:如果存储过程的两个参数一个有默认值一个没有,那么我们要把有默认值得放在后边,不然会出问题哦~~

      细心的朋友,可能看到上边的语句有一些不同,比如,存储过程用的是output,而调用语句用的是out。我要告诉您,两者是一样的。

     

      [RECOMPILE]:指示数据库引擎 不缓存该过程的计划,该过程在运行时编译。如果指定了 FOR REPLICATION,则不能使用此选项。对于 CLR 存储过程,不能指定 RECOMPILE。
 

      这个说一个非常好用的函数 OBJECT_ID :返回架构范围内对象的数据库对象标识号。

      例如:我们创建存储过程时,可以如下写代码

      If Object_ID('yangyang8848.OneGoods') Is Not Null
             Drop Proc yangyang8848.OneGoods
      Go

      Create Proc yangyang8848.OneGoods
      @GoodsCode2 varchar(10) out,@GoodsCode varchar(10) = '0011'
      As
             Select * From Master_Goods Where GoodsCode = @GoodsCode
             Set @GoodsCode2 = '0005'
      Go

      针对于上边的这个存储过程,我们调用以下SQL查询

      Select definition From sys.sql_modules
            Where object_id = Object_ID('yangyang8848.OneGoods');

      我们是可以查到结果的。

      可是如果我们对该存储过程加入[ ENCRYPTION ] 那么你将无法看到任何结果

      If Object_ID('yangyang8848.OneGoods') Is Not Null
             Drop Proc yangyang8848.OneGoods
      Go

      Create Proc yangyang8848.OneGoods
      @GoodsCode2 varchar(10) out,@GoodsCode varchar(10) = '0011'

      With Encryption
      As
             Select * From Master_Goods Where GoodsCode = @GoodsCode
             Set @GoodsCode2 = '0005'
      Go

      然后我们查询 sys.sql_modules 目录视图,将返回给你Null。

      然后我们执行以下SQL: Exec sp_helptext 'yangyang8848.OneGoods'

      你将得到以下结果:The text for object 'yangyang8848.OneGoods' is encrypted.

      说到这里你应该明白了,参数[ ENCRYPTION ]:是一种加密的功能, 将 CREATE PROCEDURE 语句的原始文本转换为模糊格式。模糊代码的输出在 SQL Server 2005 的任何目录视图中都不能直接显示。对系统表或数据库文件没有访问权限的用户不能检索模糊文本。但是,可通过 DAC 端口访问系统表的特权用户或直接访问数据库文件的特权用户可使用此文本。此外,能够向服务器进程附加调试器的用户可在运行时从内存中检索已解密的过程。

 

      前两天写了一篇关于游标的介绍文章 ,下边写一个例子,将游标与存储过程一起使用上:

      If Object_ID('dbo.GetMasterGoods') Is Not Null
            Drop Proc dbo.GetMasterGoods
      Go

      Create Proc GetMasterGoods
      @MyCursor Cursor Varying Output
      With Encryption
      As
             Set @MyCursor = Cursor
             For
                    Select GoodsCode,GoodsName From Master_Goods
      Open @MyCursor
      Go

      --下边建立另外一个存储过程,用于遍历游标输出结果

      Create Proc GetAllGoodsIDAndName
      As

      Declare @GoodsCode varchar(18)
      Declare @GoodsName nvarchar(20)
      Declare @MasterGoodsCursor Cursor
      Exec GetMasterGoods @MasterGoodsCursor out
      Fetch Next From @MasterGoodsCursor
      InTo @GoodsCode,@GoodsName
      While(@@Fetch_Status = 0)
      Begin
             Begin
                    Print @GoodsCode + ':' + @GoodsName
             End
             Fetch Next From @MasterGoodsCursor
             InTo @GoodsCode,@GoodsName
      End
      Close @MasterGoodsCursor
      Deallocate @MasterGoodsCursor
      Go

      最后执行Exec GetAllGoodsIDAndName结果为以下内容

      0003:品0003
      0004:品0004
      0005:123123
      0006:品0006
      0007:品0007
      0008:品0008
      0009:品0009
      0010:品0010
      0011:品0011
      0012:品0012
      0013:品0013
      0014:品0014

本文标题:存储过程语法-SQLSERVER 存储过程 语法
本文地址: http://www.61k.com/1108698.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1