• 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出来;
    

      

    例子
    
    CREATE PROCEDURE getCatoryChildLst
    
        @name NVARCHAR(50) 
        
        
    AS
        IF ( @name IS NOT NULL )
            BEGIN	
                SELECT str(tt.ttid)+',' FROM (SELECT id as ttid FROM fhcb_08_tbl_category where charindex('~'   +  @name+  '~'   ,   '~' + FULL_ID+ '~')>0) as tt  FOR XML PATH('') 
                
            END;
        ELSE
            SELECT -1;
    

      

  • 相关阅读:
    JSONArray数据转换成java List
    js格式化格林威治时间
    JS实现等比例缩放图片
    oracle显示一个月的所有天数
    Oracle行转列、列转行的Sql语句总结
    当echarts的legend字数过多的时候变成省略号
    oracle获取今年在内的前几年、后几年
    JAVA方法调用中的解析与分派
    static 和 final 关键字 对实例变量赋初始值的影响
    从虚拟机指令执行的角度分析JAVA中多态的实现原理
  • 原文地址:https://www.cnblogs.com/qinyios/p/11268339.html
Copyright © 2020-2023  润新知