2010-08-24 20 views
2

有什么方法可以从函数中进行选择并使其返回递增数字?在SQL Server中生成递增数字的函数

例如,做到这一点:

SELECT SomeColumn, IncrementingNumbersFunction() FROM SomeTable 

,并让它返回:

SomeColumn | IncrementingNumbers 
-------------------------------- 
some text | 0 
something | 1 
foo  | 2 
+1

几个。你想每个表行(每行),每个输出行(可能有一个WHERE子句),基于一些排序(按字母顺序排列,最早等)...? – gbn 2010-08-24 17:43:08

回答

10

上的SQL Server 2005最多可以使用ROW_NUMBER()

SELECT SomeColumn, 
    ROW_NUMBER() OVER(Order by SomeColumn) as IncrementingNumbers 
FROM SomeTable 

0N SQL Server 2000,您可以使用身份,但如果你有删除,你将有差距

SQL 2000如果您的常规表中存在与身份列之间的空白,请将其插入到带有身份的临时数据中,然后选择退出

SELECT SomeColumn, 
    IDENTITY(INT,1,1) AS IncrementingNumbers 
    INTO #temp 
FROM SomeTable 
ORDER BY SomeColumn 


SELECT * FROM #temp 
ORDER BY IncrementingNumbers 
2

,你可以自动递增标识列,还是我错过理解这个问题?

http://msdn.microsoft.com/en-us/library/Aa933196

+0

如果所有行都需要一个简单的行标识符,这就是它... – gbn 2010-08-24 17:45:26

+0

我不想制作一个表,我想要添加到SELECT语句的东西。 – 2010-08-24 19:22:28

+0

然后SQLMenace答案是我认为最好的解决方案 – Ivo 2010-08-24 20:14:58

1

不,SQLServer中没有序列生成函数。您可能会发现identity字段类型方便地解决您当前的问题。

2

我认为您在寻找ROW_NUMBER在SQL Server 2005中添加了它。它“返回结果集的分区内的行的序号,从1开始,每个分区的第一行。

From MSDN(其中有很多更多)以下示例根据年初至今的销售情况为AdventureWorks2008R2中的销售人员返回ROW_NUMBER。

SELECT FirstName, LastName, ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS 'Row Number', SalesYTD, PostalCode 

FROM Sales.vSalesPerson 

WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0; 
2

从SQL 2012版及更高版本开始,有一个built-in sequence feature

实施例:

-- sql to create the Sequence object 
CREATE SEQUENCE dbo.MySequence 
    AS int 
    START WITH 1 
    INCREMENT BY 1 ; 
GO 

-- use the sequence 
SELECT NEXT VALUE FOR dbo.MySequence; 
SELECT NEXT VALUE FOR dbo.MySequence; 
SELECT NEXT VALUE FOR dbo.MySequence;