微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sqlserver存储过程转

一.不含参数的存储过程
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),    @RmdsC NVARCHAR(500)
AS
    IF ( @OrderNO IS NOT NULL )
        BEGIN	
            INSERT  INTO dbo.Material_SO_PipeOrder
                    ( ID,@OrderNO,-- OrderName - nvarchar(50)
                      @RmdsC  -- RmdsC - nvarchar(500)
                      );
            SELECT 1;
        END;
    ELSE
        SELECT -1;
GO

执行sql语句:

EXEC  dbo.ProTest @OrderNO = N‘单号001‘,@RmdsC = N‘备注‘;

消息:

(1 行受影响)

(1 行受影响)

结果:1(表结构形式)

3.有返回值(使用return)
创建语句:

CREATE PROCEDURE dbo.ProTest

    @OrderNO NVARCHAR(50),-- 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‘,@RmdsC = N‘备注‘;

SELECT @test

消息:

(1 行受影响)

(1 行受影响)

结果:1(表结构形式)

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

CREATE PROCEDURE dbo.ProTest

    @OrderNO 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,-- 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出来;

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

相关推荐