存储过程

以一个存储过程为例,说说建立存储过程可能会碰见的东西:

==================================================================================

 IF EXISTS (SELECT * FROM SYSOBJECTS WHERE ID = OBJECT_ID('GetCommodityConsumptionSummary') AND sysstat & 0xf = 4)
    DROP PROCEDURE GetCommodityConsumptionSummary
GO
 

CREATE PROCEDURE GetCommodityConsumptionSummary
(   
    @ProductCode VARCHAR(30) =NULL,
    @ProductType TINYINT,
    @StartTime DATETIME =NULL,
    @EndTime DATETIME =NULL,
    @OrderString VARCHAR(200),
    @PageSize INT,
    @PageIndex INT,
    @TotalRecords INT OUTPUT   
   
)
AS
BEGIN
   
    IF @ProductType = 0 SET @ProductType = NULL   

    DECLARE @StartIndex int
    DECLARE @EndIndex int
   
    SET @StartIndex = @PageSize * @PageIndex
    SET @EndIndex = @PageSize * (@PageIndex + 1)
   
    SELECT
        SUM (quantity)AS TotalQuantity,
        TAB.ProductCategoryName,
        TAB.Productcode,
        TAB.ProductName,
        TAB.ProductId
    INTO #TempTable
    FROM
    (
        SELECT
            dbo.Product.ProductId AS ProductId,
            dbo.ConsumptionItem.Quantity AS Quantity,       
            dbo.Product.ProductCode AS Productcode,
            dbo.Product.ProductName AS ProductName,
            dbo.DictionaryItem.ItemName AS ProductCategoryName   
        FROM dbo.ConsumptionItem with(NOLOCK)
        INNER JOIN dbo.Consumption
            ON dbo.ConsumptionItem.ConsumptionId = dbo.Consumption.ConsumptionId
        INNER JOIN dbo.Product
            ON dbo.Product.ProductId = ConsumptionItem.ProductId
        INNER JOIN dbo.DictionaryItem
            ON DictionaryItem.ItemValue = Product.CategoryId
            AND dbo.DictionaryItem.DictionaryName='ProductCategory'   
        WHERE (@ProductCode IS NULL OR dbo.Product.ProductCode=@ProductCode)
        AND (@ProductType IS NULL OR dbo.Product.CategoryId=@ProductType)
        AND (@StartTime IS NULL OR dbo.Consumption.CreateDate>=@StartTime)
        AND (@EndTime IS NULL OR dbo.Consumption.CreateDate<=@EndTime)
    )AS TAB
    GROUP BY TAB.ProductCategoryName,TAB.Productcode,TAB.ProductName,TAB.ProductId
   
    DECLARE @Sql VARCHAR(2000)

    SET @Sql = '
    SELECT
        *
    FROM
    (
        SELECT
            Row_Number() OVER (ORDER BY + '+ @OrderString + ') AS RowNumber,
            *
        FROM #TempTable       
    ) AS Tab
    WHERE Tab.RowNumber > ' + RTRIM(@StartIndex)+
    ' AND Tab.RowNumber <=' + RTRIM(@EndIndex)

    EXEC(@Sql)   

    SELECT
        @TotalRecords = COUNT(1)
    FROM #TempTable
   
    DROP TABLE #TempTable
END
GO

 

==================================================================================

代码如上,分别讲述:

 

IF EXISTS (SELECT * FROM SYSOBJECTS WHERE ID = OBJECT_ID('GetCommodityConsumptionSummary') AND sysstat & 0xf = 4)    DROP PROCEDURE GetCommodityConsumptionSummary

 

 

SYSOBJECTS  为何?

 

sysobjects   是Sql   server   任一数据库实例都有的一个系统表,记录所有本实例内所有OBJECT的属性。object_id   是系统函数,取得某一OBJECT的全局ID。

 

sysstat & 0xf = 4为何?


sysstat是字段名
&是位操作符,是 位and 操作
0xf是16进制数 0xf=0b1111=15

sysstat  &  0xf  =  4
sysstat 与 16进制数0xf按位与的值为4时
即sysstat 与二进制数1111111按位与的值为4时
也就是sysstat的值为4时 即0000100时


 

GO 不能缺失,因为,CREATE PROCEDURE 必须是一个批处理的以第一个语句。

 

 

存储过程带参数。

1.必须是以@开头,参数可以赋初值,以备当传入参数为空的时候该存储过程的执行。

2,output 参数类型怎样在SQL里面检测:

语法如下:

DECLARE  @YY  [参数类型]

EXECUTE  [存储过程名] @i,@b,@YY OUTPUT

SELECT @YY 

3.分页的功能,pagesize 为每一页的条数,pageindex为当前页数,设定一个rownumber 当rownumber 介于某两个数之间的时候,来判断该记录位于哪一页。

4.with(NOLOCK) 详解。

 参照页面:http://www.cnblogs.com/neil-zhao/articles/1259105.html

另外,关于SQL中的锁,需要学习的东西太多,我也还有一个问题需要解决,页面如下:http://topic.csdn.net/t/20060905/14/4999881.html

 

恩,暂时就这么多,单纯的讲述在SQL中建立一个存储过程。至于怎么在VS中调用存储过程,以后在讨论。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值