`
xiquwgugou
  • 浏览: 25430 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

存储过程。经实际验证可以使用。

阅读更多
*
说明:1.支持多表查询 2.支持任意排序 3.不支持表别名
参考了
    evafly920:[分享]千万数量级分页存储过程(效果演示)
    地址:http://blog.csdn.net/evafly920/archive/2006/03/03/614813.aspx

IF(EXISTS(SELECT * FROM sysobjects WHERE [id]=OBJECT_ID('usp_PagingLarge') AND xtype='P'))
    DROP PROCEDURE usp_PagingLarge
*/

GO

CREATE PROCEDURE usp_PagingLarge
@TableNames VARCHAR(200),    --表名,可以是多个表,但不能用别名
@PrimaryKey VARCHAR(100),    --主键,可以为空,但@Order为空时该值不能为空
@Fields    VARCHAR(200),        --要取出的字段,可以是多个表的字段,可以为空,为空表示select *
@PageSize INT,            --每页记录数
@CurrentPage INT,        --当前页,0表示第1页
@Filter VARCHAR(200) = '',    --条件,可以为空,不用填 where
@Group VARCHAR(200) = '',    --分组依据,可以为空,不用填 group by
@Order VARCHAR(200) = ''    --排序,可以为空,为空默认按主键升序排列,不用填 order by
AS
BEGIN
    DECLARE @SortColumn VARCHAR(200)
    DECLARE @Operator CHAR(2)
    DECLARE @SortTable VARCHAR(200)
    DECLARE @SortName VARCHAR(200)
    IF @Fields = ''
        SET @Fields = '*'
    IF @Filter = ''
        SET @Filter = 'WHERE 1=1'
    ELSE
        SET @Filter = 'WHERE ' +  @Filter
    IF @Group <>''
        SET @Group = 'GROUP BY ' + @Group

    IF @Order <> ''
    BEGIN
        DECLARE @pos1 INT, @pos2 INT
        SET @Order = REPLACE(REPLACE(@Order, ' asc', ' ASC'), ' desc', ' DESC')
        IF CHARINDEX(' DESC', @Order) > 0
            IF CHARINDEX(' ASC', @Order) > 0
            BEGIN
                IF CHARINDEX(' DESC', @Order) < CHARINDEX(' ASC', @Order)
                    SET @Operator = '<='
                ELSE
                    SET @Operator = '>='
            END
            ELSE
                SET @Operator = '<='
        ELSE
            SET @Operator = '>='
        SET @SortColumn = REPLACE(REPLACE(REPLACE(@Order, ' ASC', ''), ' DESC', ''), ' ', '')
        SET @pos1 = CHARINDEX(',', @SortColumn)
        IF @pos1 > 0
            SET @SortColumn = SUBSTRING(@SortColumn, 1, @pos1-1)
        SET @pos2 = CHARINDEX('.', @SortColumn)
        IF @pos2 > 0
        BEGIN
            SET @SortTable = SUBSTRING(@SortColumn, 1, @pos2-1)
            IF @pos1 > 0
                SET @SortName = SUBSTRING(@SortColumn, @pos2+1, @pos1-@pos2-1)
            ELSE
                SET @SortName = SUBSTRING(@SortColumn, @pos2+1, LEN(@SortColumn)-@pos2)
        END
        ELSE
        BEGIN
            SET @SortTable = @TableNames
            SET @SortName = @SortColumn
        END
    END
    ELSE
    BEGIN
        SET @SortColumn = @PrimaryKey
        SET @SortTable = @TableNames
        SET @SortName = @SortColumn
        SET @Order = @SortColumn
        SET @Operator = '>='
    END

    DECLARE @type varchar(50)
    DECLARE @prec int
    SELECT @type=t.name, @prec=c.prec
    FROM sysobjects o
    JOIN syscolumns c on o.id=c.id
    JOIN systypes t on c.xusertype=t.xusertype
    WHERE o.name = @SortTable AND c.name = @SortName
    IF CHARINDEX('char', @type) > 0
    SET @type = @type + '(' + CAST(@prec AS varchar) + ')'

    DECLARE @TopRows INT
    SET @TopRows = @PageSize * @CurrentPage + 1
    print @TopRows
    print @Operator
    EXEC('
        DECLARE @SortColumnBegin ' + @type + '
        SET ROWCOUNT ' + @TopRows + '
        SELECT @SortColumnBegin=' + @SortColumn + ' FROM  ' + @TableNames + ' ' + @Filter + ' ' + @Group + ' ORDER BY ' + @Order + '
        SET ROWCOUNT ' + @PageSize + '
        SELECT ' + @Fields + ' FROM  ' + @TableNames + ' ' + @Filter  + ' AND ' + @SortColumn + '' + @Operator + '@SortColumnBegin ' + @Group + ' ORDER BY ' + @Order + '   
    ')   
END

GO

--调用例子:
    --1.单表/单排序
    EXEC usp_PagingLarge 'bigtable','d_id','d_id,d_title,d_content,d_time',20,1,'','','d_id desc'
    --2.单表/多排序
    EXEC usp_PagingLarge 'bigtable','d_id','*',20,0,'','','d_time asc,d_id desc'
    --3.多表/单排序
    EXEC usp_PagingLarge 'bigtable left join bigtable_author on bigtable.d_id=bigtable_author.BigTable_id', 'bigtable.d_id', 'bigtable.d_id,bigtable.d_title,bigtable.d_content,bigtable.d_time,bigtable_author.d_author', 20, 0, '', '', 'bigtable.d_id asc'
    --4.多表/多排序
    EXEC usp_PagingLarge 'bigtable left join bigtable_author on bigtable.d_id=bigtable_author.BigTable_id', 'bigtable.d_id', 'bigtable.d_id,bigtable.d_title,bigtable.d_content,bigtable.d_time,bigtable_author.d_author', 20, 0, '', '', 'bigtable.d_time asc,bigtable.d_id desc'


使用本地表语句如下,最后一个条件,b2h_member.memberid 不能为空。

EXEC usp_PagingLarge 'b2h_member left join b2h_porder on b2h_member.memberid=b2h_porder.memberid ', 'memberid', '', 20, 0, '', '', 'b2h_member.memberid asc'


sql的left join 命令详解
给个通俗的解释吧.
例表a
aid adate
1 a1
2 a2
3 a3
表b
bid bdate
1 b1
2 b2
4 b4
两个表a,b相连接,要取出id相同的字段
select * from a inner join b on a.aid = b.bid这是仅取出匹配的数据.
此时的取出的是:
1 a1 b1
2 a2 b2
那么left join 指:
select * from a left join b on a.aid = b.bid
首先取出a表中所有数据,然后再加上与a,b匹配的的数据
此时的取出的是:
1 a1 b1
2 a2 b2
3 a3 空字符
同样的也有right join
指的是首先取出b表中所有数据,然后再加上与a,b匹配的的数据
此时的取出的是:
1 a1 b1
2 a2 b2
4 空字符 b4

LEFT JOIN 或 LEFT OUTER JOIN。
左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
分享到:
评论

相关推荐

    银行转帐存储过程

    例如,你可以使用`CREATE PROCEDURE`定义存储过程,然后使用`CALL`命令执行它。在定义存储过程时,可以使用`IF`、`ELSE`等控制结构处理各种情况,以及`SELECT`、`UPDATE`等SQL语句来操作数据。 至于提供的压缩包...

    MySQL存储过程学习

    2. 在存储过程中,可以使用流程控制语句如`IF...ELSE`、`CASE`、`WHILE`和`LOOP`来实现逻辑判断和循环。 3. 使用`BEGIN`和`END`来标记存储过程的开始和结束。 4. 使用`CALL`关键字来调用已创建的存储过程。 例如,...

    SQL Server存储过程

    在实验过程中,我们执行了每个存储过程,验证了它们的功能是否正确。例如,我们调用`CUS_BUY2`查询客户编号为"C00005"的购买记录,调用`TP`查看产品名称中包含"冰箱"的产品销售情况,以及使用`p11`和`p12`来获取特定...

    SQL Server数据库实验_存储过程与触发器设计.docx

    存储过程提供了封装和重用代码的能力,提高了性能和安全性,而触发器则允许我们实现复杂的业务逻辑和数据完整性约束,两者结合使用可以构建更健壮、高效的数据库系统。通过实验的方式,我们可以更好地理解这些概念,...

    帆软报表Oracle存储过程解决storeParameter1参数试用插件

    4. 验证效果:再次打开设计器,尝试调用无参数的Oracle存储过程,应不再出现"storeParameter1"参数的错误提示。 需要注意的是,使用此插件可能需要一定的技术背景,例如对帆软报表系统架构的理解、XML配置文件的...

    存储过程应用案例新手学习存储过程的好资料

    总的来说,这个学习资料提供了存储过程的实际应用和代码细节,有助于新手快速掌握存储过程的使用,并能逐步提升在数据库管理中的技能。在深入学习的过程中,建议结合实际项目进行实践,以更好地理解和应用所学知识。

    存储过程-05.存储过程和函数结合使用

    例如,存储过程可以调用函数来执行特定的计算或验证,然后使用这些结果进行进一步的操作,如插入、更新或删除数据。函数也可以在存储过程中作为参数传递,以提供动态计算或过滤条件。 下面是一些结合使用存储过程和...

    ATM C#使用存储过程实现的程序

    在C#中,我们可以使用ADO.NET(数据访问对象)框架来调用和执行存储过程。通过SqlCommand对象,我们可以创建一个指向特定存储过程的命令,并设置其参数。例如,如果有一个名为`TransferMoney`的存储过程,用于处理...

    SQL Server存储过程解密工具

    描述中提到,该工具经过实践验证,能够成功解密并恢复存储过程的原始内容,确保解密后的存储过程与原始版本完全一致,保证了功能的完整性。 在标签中提到了"SQL Server",这表明该工具适用于微软的SQL Server数据库...

    DELPHI存储过程调用

    存储过程是预编译的SQL语句集合,它们存储在数据库服务器上,可以接受参数,执行特定任务,并返回结果。在用户登录场景中,存储过程可以用于验证用户名和密码,提高数据安全性及操作效率。 在Delphi中调用SQL ...

    存储过程 : 一个获取数据库表中密码的存储过程

    存储过程(Stored Procedure)是一种在数据库中定义好的SQL语句集合,可以在客户端通过调用存储过程的名字来执行其中的SQL语句。存储过程可以接受输入参数并返回输出结果,也可以用于控制流操作。它具有以下优点: -...

    mysql存储过程电子书,可以参考

    例如,在Web应用程序中,存储过程可以用于处理数据验证、事务管理、安全控制等。通过将敏感的数据库操作封装在存储过程中,可以限制用户对数据库的直接访问,从而提高数据的安全性。 此外,存储过程还可以用于实现...

    实验八数据库编程技术——游标、存储过程与触发器.pdf

    *数据验证:存储过程可以用于实现数据验证,例如,检查用户输入的数据是否合法。 *安全性:存储过程可以用于实现数据库的安全性,例如,限制用户的访问权限。 实验中,我们使用存储过程来实现以下操作: *添加一条...

    SQL server存储过程习题,SQL触发器习题.rar

    综上,SQL Server的存储过程和触发器是数据库编程的重要组成部分,掌握它们的使用可以帮助我们更高效地管理和维护数据库。通过做相关的习题,不仅可以巩固理论知识,还能提升实际操作技能。对于初学者而言,从基础...

    GBase8s 存储过程和触发器测试方法

    在GBase8s数据库系统中,...通过以上步骤,我们可以全面地测试GBase8s中的存储过程和触发器,确保其在实际应用中的稳定性和正确性。在开发过程中,结合单元测试和集成测试,可以进一步提升数据库组件的质量和可靠性。

    Oracle存储过程开发的要点

    3. 使用SQL*Plus工具运行存储过程,以便测试和验证其功能。 4. 对存储过程进行修改,以适应需求的变化或修复错误。 5. 通过编译错误进行调试,确保代码的正确性。 6. 当不再需要时,可以使用`DROP PROCEDURE`语句...

    mysql经典教程+mysql存储过程讲解

    在存储过程中,还可以使用条件语句(如IF-ELSE)和循环结构(如WHILE或LOOP),使得处理逻辑更加灵活。 接下来,我们讨论触发器。触发器是一种特殊的存储过程,它在特定的数据库事件(如INSERT、UPDATE或DELETE)...

    存储过程和触发器的编程

    在实际应用中,存储过程和触发器经常结合使用。例如,在订单管理系统中,当新的订单被插入时,一个触发器可以检查库存,并通过调用存储过程来更新库存信息。这样,即使在高并发环境下,也能保证库存数据的准确性和...

Global site tag (gtag.js) - Google Analytics