In a stored procedure (using SQL Server 2008 R2 SP2) is it possible to return a NewSequentialID()
without a temp table variable?
I can successfully obtain the NewSequentialID()
by using a temp table:
Getting Value of NEWSEQUENTIALID() on Insert
Perhaps I’m old school, but I try to refrain from using temp tables unless absolutely necessary… though this might be a case where it is absolutely necessary…
IF I try:
DECLARE @NewSequentialID UNIQUEIDENTIFIER;
SET @NewSequentialID = NEWID()
… it works as expected.
IF I try:
DECLARE @NewSequentialID UNIQUEIDENTIFIER;
SET @NewSequentialID = NEWSEQUENTIALID()
… I receive the following error:
The newsequentialid() built-in function can only be used in a DEFAULT expression for a column of type ‘uniqueidentifier’ in a CREATE TABLE or ALTER TABLE statement. It cannot be combined with other operators to form a complex scalar expression.
- Is the ONLY solution to use a temp table method?
- Does anyone know of a reason why Microsoft implemented a difference between
NEWSEQUENTIALID()
to work likeNEWID()
? - Anyone know if there's a chance Microsoft will update
NEWSEQUENTIALID()
to work likeNEWID()
?
Geo
UPDATE --
I'm not sure why Microsoft choose to implement the method in this manner, since they state that, "NEWSEQUENTIALID is a wrapper over the Windows UuidCreateSequential function"... but it appears that there is no non-temp-variable table method. (At least as of yet.)
Thanks for everyone's comments / answers. [Moderator Note:] I'm not sure what to do with a question when the answer is "not possible". So I'm going to give @marc_s credit for detailing a workaround.
For now -
newsequentialid()
can only be used as a default constraint on a column. That's what the error message pretty clearly says, too.So in order to get your sequential GUID's - you must have a table. No other way to do this. And no other way in SQL Server 2012, either.
I have no idea nor any information as to why there's such a difference, and why Microsoft chose to implement it this way....
Update:
OK, so you need to get that value that is being inserted into your table - how about using the
OUTPUT
clause?Something like:
This way, the output from the
INSERT
operation - the newly created sequential GUIDs - is being stored into that table variable, and you can use that, return it, slice it - whatever you like!