您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

返回数字列表直至达到设定值

返回数字列表直至达到设定值

你可以做:

SELECT        rn = 1 
  UNION ALL SELECT 2 
  UNION ALL SELECT 3 
  UNION ALL SELECT 4 
  UNION ALL SELECT 5;

当数字是5而不是50或5000时,这是可以容忍的。当您需要更多时,您可以执行以下操作:使用CTE建立一组数字,然后交叉联接以爆炸该组(您可以看到几个示例)在此,位于“内联1”/“内联2”下)。

或者您可以构建一个数字表,假设您可能需要5个或可能需要一百万个:

SET NOCOUNT ON;

DECLARE @UpperLimit INT = 1000000;

WITH n AS
(
    SELECT
        x = ROW_NUMBER() OVER (ORDER BY s1.[object_id])
    FROM       sys.all_objects AS s1
    CROSS JOIN sys.all_objects AS s2
    CROSS JOIN sys.all_objects AS s3
)
SELECT Number = x
  INTO dbo.Numbers
  FROM n
  WHERE x BETWEEN 1 AND @UpperLimit;

GO
CREATE UNIQUE CLUSTERED INDEX n ON dbo.Numbers(Number);
GO

然后,当您需要一些数字时,您只需说:

SELECT TOP (5) rn = Number 
  FROM dbo.Numbers 
  ORDER BY Number;

显然,使用sys.all_columns或具有足够行的任何内置对象可以避免创建Numbers表的前期步骤(无论如何,出于某些原因,很多人都反对此表)。

现在,这将是,如果有非常好的 更优雅的方式来做到这一点,不是吗?您不会在任何当前版本中看到它,但有可能我们会在将来的版本中看到它。请在此处进行投票(更重要的是,对您的用例发表评论):

http://connect.microsoft.com/SQLServer/feedback/details/258733/add-a-built- in-table-of- numbers

其他 2022/1/1 18:35:01 有386人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶