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出來;


---------------------
作者:水煮 魚
來源:CSDN
原文:https://blog.csdn.net/u013986317/article/details/80332533
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM