SQLServer执行存储过程

SQLServer执行存储过程

一.不含参数的存储过程1.没有返回值:创建语句:

CREATE PROCEDURE dbo.ProTestAS DECLARE @test int SET @test = 1

Go

执行SQL语句:

EXEC dbo.ProTest

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

2.有返回值(使用select):创建语句:CREATE PROCEDURE dbo.ProTestAS 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结果为NULLSELECT @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 版权声明:本文为博主原创文章,转载请附上博文链接!