一.不含參數的存儲過程
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
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!