• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    SqlServer 2005 T-SQL Query 学习笔记(4)
    比如,我要建立一个1,000,000行的数字表:

    CREATE TABLE dbo.Nums(n INT NOT NULL PRIMARY KEY);
    DECLARE @max AS INT, @rc AS INT;
    SET @max = 1000000;
    SET @rc = 1;

    INSERT INTO Nums VALUES(1);
    WHILE @rc * 2 = @max
    BEGIN
    INSERT INTO dbo.Nums SELECT n + @rc FROM dbo.Nums;
    SET @rc = @rc * 2;
    END

    INSERT INTO dbo.Nums
    SELECT n + @rc FROM dbo.Nums WHERE n + @rc = @max;




    这种方式非常巧妙,它并不是一个一个的循环插入,而是一次插入很多行,{1},{2},{3,4},{5,6,7,8}。。。



    为什么这样会快呢?

    是因为它节省了跟比较其他可用解决方案进行比较和记录这些日志的时间。



    然后,作者给了一个CTE的递归的解决方案:

    DECLARE @n AS BIGINT;
    SET @n = 1000000;

    WITH Nums AS
    (
    SELECT 1 AS n
    UNION ALL
    SELECT n + 1 FROM Nums WHERE n @n
    )
    SELECT n FROM Nums
    OPTION(MAXRECURSION 0);--为了移除默认100的递归限制


    有个更优的CTE的解决方案,就是先生成很多行,然后用ROW_NUMBER进行计算,再选择ROW_NUMBER这列的值就可以了。

    复制代码 代码如下:

    DECLARE @n AS BIGINT;
    SET @n = 1000000;

    WITH Base AS
    (
    SELECT 1 AS n
    UNION ALL
    SELECT n + 1 FROM Base WHERE n CEILING(SQRT(@n))
    ),
    Expand AS
    (
    SELECT 1 AS c
    FROM Base AS B1, Base AS B2
    ),
    Nums AS
    (
    SELECT ROW_NUMBER() OVER(ORDER BY c) AS n
    FROM Expand
    )
    SELECT n FROM Nums WHERE n = @n
    OPTION(MAXRECURSION 0);


    利用笛卡尔积进行不断的累加,达到了22n行。

    最后,作者给出了一个函数,用于生成这样的数字表:
    复制代码 代码如下:

    CREATE FUNCTION dbo.fn_nums(@n AS BIGINT) RETURNS TABLE
    AS
    RETURN
    WITH
    L0 AS(SELECT 1 AS c UNION ALL SELECT 1),
    L1 AS(SELECT 1 AS c FROM L0 AS A, L0 AS B),
    L2 AS(SELECT 1 AS c FROM L1 AS A, L1 AS B),
    L3 AS(SELECT 1 AS c FROM L2 AS A, L2 AS B),
    L4 AS(SELECT 1 AS c FROM L3 AS A, L3 AS B),
    L5 AS(SELECT 1 AS c FROM L4 AS A, L4 AS B),
    Nums AS(SELECT ROW_NUMBER() OVER(ORDER BY c) AS n FROM L5)
    SELECT n FROM Nums WHERE n = @n;
    GO
    您可能感兴趣的文章:
    • SQLServer用t-sql命令批量删除数据库中指定表(游标循环删除)
    • 如何在SQL Server 2008下轻松调试T-SQL语句和存储过程
    • SQL Server中的T-SQL的基本对象
    • SqlServer 2005 T-SQL Query 学习笔记(3)
    • SqlServer 2005 T-SQL Query 学习笔记(2)
    • SqlServer 2005 T-SQL Query 学习笔记(1)
    • SQLServer 2008 新增T-SQL 简写语法
    • SQL Server 数据库管理常用的SQL和T-SQL语句
    • SQL Server 数据库管理常用的SQL和T-SQL语句
    • SQL Server 数据库管理常用的SQL和T-SQL语句
    • T-sql语句修改SQL Server数据库逻辑名、数据库名、物理名的方法
    上一篇:SqlServer 2005 T-SQL Query 学习笔记(3)
    下一篇:SQLserver 2005文件和文件组的作用说明
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    SqlServer 2005 T-SQL Query 学习笔记(4) SqlServer,2005,T-SQL,Query,学习,