A Globally Unique Identifier (GUID), also known as a Universally Unique Identifier (UUID), is a 16-byte value used to uniquely identify information in computer systems. In SQL Server, the uniqueidentifier
data type is used to store these GUIDs. This article explains how to declare and use GUIDs in SQL Server, covering initialization, comparison, conversion, limitations, and best practices.
Declaring a uniqueidentifier
Variable or Column
You can declare a uniqueidentifier
as either a local variable or a column in a table. Here’s how:
Declaring a Local Variable:
DECLARE @myGUID uniqueidentifier;
Declaring a Column in a Table:
CREATE TABLE MyTable (
ID uniqueidentifier,
OtherColumn VARCHAR(255)
);
Initializing a uniqueidentifier
Value
A uniqueidentifier
column or local variable can be initialized in several ways:
1. Using NEWID()
function
The NEWID()
function generates a new, random GUID. This is the most common method for creating new GUIDs.
DECLARE @myGUID uniqueidentifier;
SET @myGUID = NEWID();
SELECT @myGUID;
2. Using NEWSEQUENTIALID()
function
The NEWSEQUENTIALID()
function generates a new GUID that is guaranteed to be greater than any GUID previously generated by this function on that computer since Windows was started. This can be useful for improving index performance when the uniqueidentifier
column is used as a clustered index.
DECLARE @mySequentialGUID uniqueidentifier;
SET @mySequentialGUID = NEWSEQUENTIALID();
SELECT @mySequentialGUID;
3. Converting from a String Constant
You can initialize a uniqueidentifier
from a string constant in the format xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
, where each x
is a hexadecimal digit (0-9 or a-f).
DECLARE @myGUID uniqueidentifier;
SET @myGUID = '6F9619FF-8B86-D011-B42D-00C04FC964FF';
SELECT @myGUID;
Alt text: Initializing a uniqueidentifier variable in SQL Server using a predefined string value.
Comparing uniqueidentifier
Values
Comparison operators can be used with uniqueidentifier
values. However, the ordering is not implemented by comparing the bit patterns of the two values. The only operations that can be performed against a uniqueidentifier
value are comparisons (=, <>, <, >, <=, >=) and checking for NULL (IS NULL and IS NOT NULL).
DECLARE @guid1 uniqueidentifier = NEWID();
DECLARE @guid2 uniqueidentifier = NEWID();
IF @guid1 = @guid2
PRINT 'GUIDs are equal';
ELSE
PRINT 'GUIDs are not equal';
Converting uniqueidentifier
Data
The uniqueidentifier
type is considered a character type for conversion purposes. Therefore, it is subject to the truncation rules for converting to a character type. When character expressions are converted to a character data type of a different size, values that are too long for the new data type are truncated.
DECLARE @myid uniqueidentifier = NEWID();
SELECT CONVERT(CHAR(255), @myid) AS 'char';
The following example demonstrates the truncation of data when the value is too long for the data type being converted to:
DECLARE @ID NVARCHAR(max) = N'0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong';
SELECT @ID, CONVERT(uniqueidentifier, @ID) AS TruncatedValue;
Alt text: Demonstrating truncation when converting a string longer than 36 characters to uniqueidentifier in SQL Server.
Limitations and Restrictions
Certain tools and features in SQL Server do not support the uniqueidentifier
data type:
- PolyBase
- dwloader loading tool for Parallel Data Warehouse
Best Practices for Using uniqueidentifier
- Use
NEWSEQUENTIALID()
for Clustered Indexes: When usinguniqueidentifier
as a clustered index, consider usingNEWSEQUENTIALID()
to avoid page splits and improve performance. - Understand Truncation: Be aware of potential data truncation when converting between
uniqueidentifier
and character types. Ensure the target data type is large enough to accommodate the entire GUID value. - Consider Storage Size:
uniqueidentifier
columns consume 16 bytes of storage. Consider whether this is the most efficient choice for your application, especially in tables with a large number of rows. - Avoid Ordering Assumptions: Do not rely on the inherent ordering of GUIDs generated by
NEWID()
for sorting or other operations requiring sequential values. If sequential IDs are needed, useNEWSEQUENTIALID()
.
Use Cases for uniqueidentifier
- Primary Keys: Used as primary keys to ensure unique identification of records across multiple tables or databases.
- Replication: Essential for merge replication and transactional replication to guarantee unique identification of rows across multiple copies of the table.
- Distributed Systems: Useful in distributed systems where generating unique identifiers across different systems is crucial.
- Tracking: Can be used to track unique instances of processes, events, or data entries.
Conclusion
The uniqueidentifier
data type in SQL Server provides a reliable way to store and manage globally unique identifiers. By understanding how to declare, initialize, compare, and convert uniqueidentifier
values, developers can effectively use GUIDs to ensure data integrity and uniqueness in various applications. When designing your database schema, consider the limitations and best practices associated with uniqueidentifier
to optimize performance and storage efficiency.