Tsql 生成特定长度的结果集

Tsql 生成特定长度的结果集,tsql,sql-server-2012,Tsql,Sql Server 2012,我需要在一些表中插入一定数量的行,这些行的值取自变量。我当然可以一次插入一行循环,但这太简单了。我正在寻找更优雅的解决方案。我现在的想法是插入到。。。选择语句,但现在我需要一个查询来生成所需的行数。我试图编写递归CTE来实现这一点: CREATE FUNCTION ufGenerateRows(@numRows INT = 1) RETURNS @RtnValue TABLE ( RowID INT NOT NULL ) AS BEGIN WITH numbers AS

我需要在一些表中插入一定数量的行,这些行的值取自变量。我当然可以一次插入一行循环,但这太简单了。我正在寻找更优雅的解决方案。我现在的想法是插入到。。。选择语句,但现在我需要一个查询来生成所需的行数。我试图编写递归CTE来实现这一点:

CREATE FUNCTION ufGenerateRows(@numRows INT = 1)
RETURNS @RtnValue TABLE
(
    RowID INT NOT NULL
)
AS
BEGIN
    WITH numbers AS
    (
        SELECT 1 as N
        UNION ALL
        SELECT N + 1
        FROM numbers 
        WHERE N + 1 <= @numRows
    )
    INSERT INTO @RtnValue
        SELECT N
        FROM numbers

    RETURN
END
GO

它可以工作,但递归深度限制为100,这对我来说是不合适的。你能提出替代方案吗?

不要反复思考-循环-而是基于集合-一次完成

插入到…SELECT TOP x…中,无需重复插入即可完成所需操作

当我没有绑定到手机时,我将举一个例子

更新:


@AaronBertrand说了什么:SELECT中的交叉连接非常合适。

不要反复思考-循环-而是基于集合-一次完成所有操作

插入到…SELECT TOP x…中,无需重复插入即可完成所需操作

当我没有绑定到手机时,我将举一个例子

更新:

@AaronBertrand说了什么:“选择”中的交叉连接是当场出现的

始终使用dbo。创建或引用对象(尤其是函数)时的架构前缀。 尽可能创建内联表值函数,而不是多语句表值函数。 递归CTE是生成集合的效率最低的方法。有关更好的示例,请参见本系列的三部分:

以下是一个例子:

CREATE FUNCTION dbo.GenerateRows(@numRows INT = 1)
RETURNS TABLE
AS
  RETURN 
  (
    SELECT TOP (@numRows) RowID = ROW_NUMBER() OVER (ORDER BY s1.[number])
      FROM master.dbo.spt_values AS s1
      -- CROSS JOIN master.dbo.spt_values AS s2 
      ORDER BY s1.[number]
  );
如果需要的行数超过2500行,可以与自身或其他表交叉连接

更好的做法是再次创建自己的数字表,请参见上面的链接以获取示例

始终使用dbo。创建或引用对象(尤其是函数)时的架构前缀。 尽可能创建内联表值函数,而不是多语句表值函数。 递归CTE是生成集合的效率最低的方法。有关更好的示例,请参见本系列的三部分:

以下是一个例子:

CREATE FUNCTION dbo.GenerateRows(@numRows INT = 1)
RETURNS TABLE
AS
  RETURN 
  (
    SELECT TOP (@numRows) RowID = ROW_NUMBER() OVER (ORDER BY s1.[number])
      FROM master.dbo.spt_values AS s1
      -- CROSS JOIN master.dbo.spt_values AS s2 
      ORDER BY s1.[number]
  );
如果需要的行数超过2500行,可以与自身或其他表交叉连接

更好的做法是再次创建自己的数字表,请参见上面的链接以获取示例。

从什么中选择?为了获得顶部的@n行,我需要一些已经有@n行或更多行的行源。选择什么?为了获得顶部@n行,我需要一些已经有@n行或更多行的行源。可能的重复可以设置大于100的maxrecursion限制,但交叉连接的CTE更好。可能的重复可以设置大于100的maxrecursion限制,但交叉连接的CTE更好。