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) ,
    @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出來;


原文:https://blog.csdn.net/u013986317/article/details/80332533 
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章