【问题标题】:Efficient way of filling up the table with million empty rows用百万个空行填满表格的有效方法
【发布时间】:2013-03-24 17:32:22
【问题描述】:

您知道用大量空行填充表格的任何有效方法吗?使用WHILE 子句插入它们并不是很有效。用空行填充表格肯定有比这更好的方法:

DECLARE @CNT int
SET @CNT = 1
WHILE @CNT < 3
BEGIN
INSERT INTO TAB VALUES( '1' )
SET @CNT = @CNT + 1
END

我还想知道,是否可以在不使用任何现有表的情况下使用 SELECT 子句和 CTE(通用表表达式)显示 1 百万行(编号从 1 到 1000000)。

我将不胜感激。

【问题讨论】:

  • 什么版本的 SQL Server?

标签: sql-server-2008 tsql insert common-table-expression


【解决方案1】:

这是一种生成数字序列的方法:

SELECT TOP (1000000) n = CONVERT(INT, ROW_NUMBER() OVER (ORDER BY s1.[object_id]))
INTO yourtable
FROM sys.all_objects AS s1 CROSS JOIN sys.all_objects AS s2
OPTION (MAXDOP 1);

CREATE UNIQUE CLUSTERED INDEX n ON yourtable(n)
-- WITH (DATA_COMPRESSION = PAGE)
;

查看SQL Fiddle with Demo 正在创建的 100 个号码。

此代码来自@Aaron Bertrand's 文章Generate a set or sequence without loops – part 1。本文还包括其他生成数列的方法。

【讨论】:

  • 你好蓝脚。这正是我一直在寻找的!非常感谢您的帮助:) 问候
  • @AaronBertrand 我正在慢慢学习正确的做事方式。 :)
【解决方案2】:
CREATE PROCEDURE dorepeat()
BEGIN
    SET @x = 0;
    REPEAT 
        INSERT INTO your_table (value) VALUES ("");
        SET @x = @x + 1; 
    UNTIL @x > 999999 END REPEAT;
END

我认为这样的事情非常快。

【讨论】:

  • 当有更好的基于集合的替代方案可供您使用时,一对一的循环肯定不会“相当快”。另外,这是什么平台?当然看起来不像 SQL Server,它没有像 REPEATUNTIL 这样的关键字。它还使用带引号的标识符作为字符串分隔符(SQL Server 使用'single quotes' 来分隔字符串),我看不出您在哪里声明了@x
  • 是的,这是真的。当我写下答案时,没有给出服务器版本^^
猜你喜欢
  • 2014-03-18
  • 1970-01-01
  • 2011-06-18
  • 2015-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
  • 2018-08-15
相关资源
最近更新 更多