我已经看到了用于返回数字列表如下
SELECT TOP (SELECT MAX(Quantity) FROM @d)
rn = ROW_NUMBER() OVER (ORDER BY object_id)
FROM sys.all_columns
ORDER BY object_id
如果最大数量是5,然后我假定上述返回:
rn
1
2
3
4
5
有没有返回数字的此列表的更优雅的方式?
我已经看到了用于返回数字列表如下
SELECT TOP (SELECT MAX(Quantity) FROM @d)
rn = ROW_NUMBER() OVER (ORDER BY object_id)
FROM sys.all_columns
ORDER BY object_id
如果最大数量是5,然后我假定上述返回:
rn
1
2
3
4
5
有没有返回数字的此列表的更优雅的方式?
你可以做:
SELECT rn = 1
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
UNION ALL SELECT 5;
这是可以容忍的,当数为5个,但不是50或5000当您需要更多,你可以做这样的事情用一个CTE来建立一组数字来那么CROSS JOIN爆炸设定的(你可以看到一对夫妇的例子这里,内插的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
我用这样的事情在过去 - 尽管它只能达到100左右:
WITH Numbers(number) AS (
SELECT 1 number
UNION ALL
SELECT number+1 FROM Numbers WHERE number < 10)
SELECT * FROM Numbers
首先,创建数表0 - 9
create table dbo.Digits (digit tinyint not null Primary Key)
insert into dbo.Digits values (0), (1), (2), (3), (4), (5), (6), (7), (8), (9)
然后你就可以产生以下CROSS JOIN从1到100来算:
select
D2.digit * 10 +
D1.digit + 1 as n
from dbo.Digits D1,
dbo.Digits D2
order by n
从1数到1000,你只需要增加一个额外的交叉连接:
select
D3.digit * 100 +
D2.digit * 10 +
D1.digit + 1 as n
from dbo.Digits D1,
dbo.Digits D2,
dbo.Digits D3
order by n
从1计数至x(其中,x <= 1000)::
select top x
D3.digit * 100 +
D2.digit * 10 +
D1.digit + 1 as n
from dbo.Digits D1,
dbo.Digits D2,
dbo.Digits D3
order by n
绝对不是最优雅的,但可能是更大序列的最快方法:
WITH
E1(N) AS (SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1), --10E1 or 10 rows
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E3 or 10000 rows
E8(N) AS (SELECT 1 FROM E4 a, E4 b) --10E4 or 100000000 rows
SELECT TOP (@DesiredRowCount) N = ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E8
;
没有临时表,无表中读取,你可以自己定义你的最大值。
从您可以复制,粘贴准备使用的功能在这里
修改前值要求:
SELECT TOP 30 ROW_NUMBER() OVER (ORDER BY [object_id])
FROM sys.all_objects
例如,呈现出范围为NULL,1一个下拉列表 - 为受教育年限的名单30。
<tr>
<td>Education</td>
<td>
<asp:DropDownList ID="EducationDropDownList" runat="server" DataSourceID="sd6"
DataValueField="Education" DataTextField="Education"
SelectedValue='<%# Bind("Education") %>' CssClass="metro" />
<asp:SqlDataSource ID="sd6" runat="server"
ConnectionString="<%$ ConnectionStrings:cnYours %>"
SelectCommand="SELECT NULL AS Education UNION ALL SELECT TOP 30 ROW_NUMBER() OVER (ORDER BY [object_id]) FROM sys.all_objects"
SelectCommandType="Text" />
</td>
</tr>
如果你只是想你的输出包含一个流水号作为一个附加列,下面将工作以及:
select row_number() over (order by (Select 1)) AS RowNum, * from Table_1 where Column_3 = 372 and Column_6 = 2017;