SQLServer中各种存储过程创建及执行方式

C#中执行存储过程参照:C#执行存储过程的方法

一.不含参数的存储过程

1.没有返回值:

创建语句:

CREATE PROCEDURE dbo.ProTest
AS 
    DECLARE @test int
    SET @test = 1

Go

执行SQL语句:

EXEC dbo.ProTest

消息:命令已成功完成。结果:无

2.有返回值(使用select):
创建语句:

CREATE PROCEDURE dbo.ProTest
AS
    DECLARE @test INT;
    SET @test = 123;
    SELECT  @test;

GO

执行SQL语句:

EXEC dbo.ProTest

消息:(1 行受影响)。结果:123(表结构形式)

3.有返回值(使用return)

创建语句:

CREATE PROCEDURE dbo.ProTest

AS
    DECLARE @test INT;
    SET @test = 123;
    RETURN @test;

GO

执行SQL语句:

DECLARE @test INT;
EXEC @test = dbo.ProTest;

SELECT  @test

消息:(1 行受影响)。结果:123(表结构形式)

4.查询一个或多个集合(类似执行select)

创建语句:

CREATE PROCEDURE dbo.ProTest

AS
    SELECT  *
    FROM    dbo.Material_SO_PipeOrder;

GO

执行SQL语句:

EXEC dbo.ProTest

消息:查询出来的条数

结果:查询结果

二.含参数的存储过程

1.没有返回值

创建语句:

CREATE PROCEDURE dbo.ProTest

    @OrderNO NVARCHAR(50) ,
    @OrderName NVARCHAR(50) ,
    @RMDSC NVARCHAR(500) = NULL  --表示可为空参数
AS
    IF ( @OrderNO IS NOT NULL )
        BEGIN
            INSERT  INTO dbo.Material_SO_PipeOrder
                    ( ID, OrderNO, OrderName, RMDSC )
            VALUES  ( NEWID(), -- ID - uniqueidentifier
                      @OrderNO, -- OrderNO - nvarchar(50)
                      @OrderName, -- OrderName - nvarchar(50)
                      @RMDSC  -- RMDSC - nvarchar(500)
                      );
        END;

GO

执行SQL语句:

EXEC dbo.ProTest @OrderNO = N'单号001', @OrderName = N'名称001', @RMDSC = N'备注'

(或不写列名"EXEC  dbo.ProTest  N'单号001', N'名称001', N'备注';",但不能混合使用,下同)

 消息:(1 行受影响)。结果:无

2.有返回值(使用select)

创建语句:

CREATE PROCEDURE dbo.ProTest

    @OrderNO NVARCHAR(50) ,
    @OrderName NVARCHAR(50) ,
    @RMDSC NVARCHAR(500)
AS
    IF ( @OrderNO IS NOT NULL )
        BEGIN
            INSERT  INTO dbo.Material_SO_PipeOrder
                    ( ID, OrderNO, OrderName, RMDSC )
            VALUES  ( NEWID(), @OrderNO, -- OrderNO - nvarchar(50)
                      @OrderName, -- OrderName - nvarchar(50)
                      @RMDSC  -- RMDSC - nvarchar(500)
                      );
            SELECT 1;
        END;
    ELSE
        SELECT -1;

GO

执行SQL语句:

EXEC  dbo.ProTest @OrderNO = N'单号001', @OrderName = N'名称001', @RMDSC = N'备注';

消息:

(1 行受影响)

(1 行受影响)

结果:1(表结构形式)

3.有返回值(使用return)

创建语句:

CREATE PROCEDURE dbo.ProTest

    @OrderNO NVARCHAR(50) ,
    @OrderName NVARCHAR(50) ,
    @RMDSC NVARCHAR(500)
AS
    IF ( @OrderNO IS NOT NULL )
        BEGIN
            INSERT  INTO dbo.Material_SO_PipeOrder
                    ( ID, OrderNO, OrderName, RMDSC )
            VALUES  ( NEWID(), @OrderNO, -- OrderNO - nvarchar(50)
                      @OrderName, -- OrderName - nvarchar(50)
                      @RMDSC  -- RMDSC - nvarchar(500)
                      );
            RETURN 1;
        END;
    ELSE
        RETURN -1;

GO

执行SQL语句:

DECLARE @test INT;
EXEC @test = dbo.ProTest @OrderNO = N'单号001', @OrderName = N'名称001', @RMDSC = N'备注';

SELECT @test

消息:

(1 行受影响)

(1 行受影响)

结果:1(表结构形式)

4.带输出参数的存储过程(以没有返回值的为例)

创建语句:

CREATE PROCEDURE dbo.ProTest

    @OrderNO NVARCHAR(50) ,
    @OrderName NVARCHAR(50) ,
    @RMDSC NVARCHAR(500) ,
    @ID UNIQUEIDENTIFIER OUTPUT --输出参数要用output标识
AS
    IF ( @OrderNO IS NOT NULL )
        BEGIN
            DECLARE @newID UNIQUEIDENTIFIER;
            SET @newID = NEWID();
            INSERT  INTO dbo.Material_SO_PipeOrder
                    ( ID ,
                      OrderNO ,
                      OrderName ,
                      RMDSC
                    )
            VALUES  ( @newID ,
                      @OrderNO , -- OrderNO - nvarchar(50)
                      @OrderName , -- OrderName - nvarchar(50)
                      @RMDSC  -- RMDSC - nvarchar(500)
                    );
            SET @ID = @newID;--可以不赋值
        END;
    ELSE
        SET @ID = NULL;--可以不赋值

GO

执行SQL语句:

DECLARE @IDTest UNIQUEIDENTIFIER;
EXEC dbo.ProTest @OrderNO = N'单号001', -- nvarchar(50)
    @OrderName = N'名称001', -- nvarchar(50)
    @RMDSC = N'备注', -- nvarchar(500)
    @ID = @IDTest OUTPUT; --如果不加OUTPUT,select结果为NULL
SELECT  @IDTest;

消息:

(1 行受影响)

(1 行受影响)

结果:EDD11EF3-CD03-4C95-8B79-B3123B34C292(表结构形式)

三.总结与注意:

1.关于存储过程的返回值:

(1).如果有return,则返回return的结果;

(2).如果没有return,则返回INT值0(即使存储过程中有select集合,或Insert受影响行等);

(3).如果带输出参数,则存储过程的返回值同(1),(2);OUTPUT的参数需要select出来;



阅读更多
文章标签: SQL PROCEDURE
个人分类: SQL PROCEDURE
上一篇认识EF框架中Attach与Entry
下一篇关于sql连接语句中的Integrated Security=SSPI
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭