If you’ve delved into Window Functions at all then you probably have read the documentation about the OVER() clause.
While reading this recently, I noticed that a sequence can have an OVER() clause attached to it.
I was curious about this so I experimented.
Consider the following.
USE tempdb; GO IF EXISTS(SELECT * FROM sys.sequences AS S WHERE S.[name] = 'TestSeq' AND OBJECT_SCHEMA_NAME(S.[object_id]) = 'dbo') BEGIN DROP SEQUENCE dbo.TestSeq; END; GO CREATE sequence dbo.TestSeq AS BIGINT START WITH 1 INCREMENT BY 1 NO CYCLE NO CACHE; GO
So now we have a SEQUENCE object that we can play with.
And, as expected the following worked fine.
SELECT NEXT VALUE FOR dbo.TestSeq; /* Lets put the value into a variable */DECLARE @value BIGINT = 0; SELECT @value =NEXT VALUE FOR dbo.TestSeq;
But, did you also know that you can do this (whether or not you would want to is a different matter)
SELECT NEXT VALUE FOR dbo.TestSeq AS [TestValue]; SELECT NEXT VALUE FOR dbo.TestSeq OVER(ORDER BY NEWID()) AS [TestValue]; SELECT NEXT VALUE FOR dbo.TestSeq OVER(ORDER BY (SELECT NULL)); SELECT NEXT VALUE FOR dbo.TestSeq OVER(ORDER BY (SELECT 1)); SELECT NEXT VALUE FOR dbo.TestSeq OVER(ORDER BY RAND());
That’s pretty interesting, but not a whole load of use.
We can also do this
USE tempdb; GO /* There's three of these objects in tempdb */SELECT RowNumber = NEXT VALUE FOR dbo.TestSeq OVER(ORDER BY O.[type] ASC) ,* FROM sys.objects AS O WHERE O.[type] IN ('SQ') ORDER BY RowNumber DESC; /* And ordered the opposite way around */SELECT RowNumber = NEXT VALUE FOR dbo.TestSeq OVER(ORDER BY O.[type] DESC) ,* FROM sys.objects AS O WHERE O.[type] IN ('SQ') ORDER BY RowNumber ASC;
Did you spot that a column from sys.objects was used in the OVER() clause and that the ORDER BY in the OVER() clause and main query are the opposite away around.
We are unable to use PARTITION within the OVER() clause of a SEQUENCE, which total makes sense as we only get one row back.
This could come in handy and save us a join.
I hope that helps somebody out someday.
Have a great day
Cheers
Marty.