Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在表中生成固定数量的行_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

Sql server 在表中生成固定数量的行

Sql server 在表中生成固定数量的行,sql-server,sql-server-2008,tsql,Sql Server,Sql Server 2008,Tsql,无法正确回答问题,因此无法搜索我想要的内容。我所需要的只是一个虚拟表,其中有一列say guid,我将其用于其他目的。没有写同样的插入语。。newID n次,想知道是否有一个优雅的解决方案 类似的问题是,如何用int列(比如1-n个数字)填充空白表 Row1: 1 Row2: 2 ....... Row100:100 你可以递归地做 对于数字,例如: WITH r AS ( SELECT 1 AS n UNION ALL SELECT n+1 FROM r WHERE

无法正确回答问题,因此无法搜索我想要的内容。我所需要的只是一个虚拟表,其中有一列say guid,我将其用于其他目的。没有写同样的插入语。。newID n次,想知道是否有一个优雅的解决方案

类似的问题是,如何用int列(比如1-n个数字)填充空白表

Row1: 1
Row2: 2
.......
Row100:100

你可以递归地做

对于数字,例如:

WITH r AS (
    SELECT 1 AS n
    UNION ALL
    SELECT n+1 FROM r WHERE n+1<=100
)
SELECT * FROM r
单向

;with guids( i, guid ) as
(
    select 1 as i, newid() 
        union all
    select i + 1, newid() 
        from guids
        where i < 100
)

select guid from guids option (maxrecursion 100)

与递归CTE不同,我建议对任何已知已超过100行的对象使用基于集合的方法

--INSERT dbo.newtable(ID, GUID)
SELECT TOP (100) ROW_NUMBER() OVER (ORDER BY [object_id]), NEWID()
  FROM sys.all_columns ORDER BY [object_id];
有关大量其他想法,请参阅本系列:


这种方法非常快。如果您需要从无到有地生成一个数字表,这可能是最好的方法

WITH
  t0(i) AS (SELECT 0 UNION ALL SELECT 0),
  t1(i) AS (SELECT 0 FROM t0 a, t0 b),
  t2(i) AS (SELECT 0 FROM t1 a, t1 b),
  t3(i) AS (SELECT 0 FROM t2 a, t2 b),
  n(i) AS (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 0)) FROM t3)
SELECT i FROM n WHERE i BETWEEN 1 AND 100

只是添加了这个,因为它没有列出:

获取10行的快速方法:

SELECT ROW_NUMBER() OVER(
        ORDER BY N1.N) 
        , LOWER(NEWID())
    FROM   (VALUES(1), (1), (1), (1), (1), (1), (1), (1), (1), (1)) AS N1(N)          -- 10
如果希望它基于变量,请执行以下操作:

DECLARE  @N int = 10;
WITH Numbers(number)
     AS (SELECT ROW_NUMBER() OVER(
                ORDER BY N1.N)
         FROM   (VALUES(1), (1), (1), (1), (1), (1), (1), (1), (1), (1)) AS N1(N)          -- 10
                CROSS JOIN(VALUES(1), (1), (1), (1), (1), (1), (1), (1), (1), (1)) AS N2(N)-- 100  
                --CROSS JOIN (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) AS N3 (N)   -- 1,000
                --CROSS JOIN (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) AS N4 (N)   -- 10,000
                --CROSS JOIN (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) AS N5 (N) -- 100,000
                -- Etc....
)
     SELECT *
          , LOWER(NEWID())
     FROM   Numbers
     WHERE  number <= @N;

请看前面的问题:请看这个问题:关于数字表我不确定每次执行调用2.7毫秒的速度是否会快得惊人,相比之下,本页上其他更简单的变体的调用速度为3.1毫秒,但确定在测试时也不要忘了生成GUID:-不适用于101行及以上-默认CTE嵌套限制