手机
当前位置:查字典教程网 >编程开发 >mssql数据库 >SqlServer 2005 T-SQL Query 学习笔记(4)
SqlServer 2005 T-SQL Query 学习笔记(4)
摘要:比如,我要建立一个1,000,000行的数字表:CREATETABLEdbo.Nums(nINTNOTNULLPRIMARYKEY);DEC...

比如,我要建立一个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 2005 T-SQL Query 学习笔记(4)】相关文章:

HeadFirstSQL:学习笔记2/2

SQL Server 2005中的外联结用法

Sql Server 2005 默认端口修改方法

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

SQL Server 2008 Express如何开启远程访问

Sqlserver2005日志文件太大如何减小

SQL Server 2005与sql 2000之间的数据转换方法

深入SqlServer2008 数据库同步的两种方式(Sql JOB)的分析介绍

SQLServer基础语法实例应用(三)

SQL Server 2005 模板参数使用说明

精品推荐
分类导航