SQL Server 中的全域唯一標識碼 (GUID) 數據類型是以數據類型表示 uniqueidentifier ,其會儲存 16 位元組二進位值。 GUID 是二進制數字,其主要用途是在有多台電腦的網路中作為必須唯一的識別碼。 GUIDs 可以藉由呼叫 Transact-SQL NEWID 函數生成,並保證在全球範圍內是唯一的。 如需詳細資訊,請參閱 uniqueidentifier (Transact-SQL)。
使用 SqlGuid 值
因為 GUID 值很長且模糊不清,所以對用戶來說並不有意義。 如果使用隨機生成的 GUID 作為索引鍵的值,並且插入大量資料列,這會在索引中造成隨機 I/O,從而對效能產生負面影響。 相較於其他數據類型,GUID 也相對較大。 一般而言,我們建議只針對沒有其他數據類型適合的非常窄的案例使用 GUID。
比較 GUID 值
比較運算子可以搭配 uniqueidentifier 值使用。 不過,不會藉由比較兩個值的位模式來實作排序。 唯一允許針對uniqueidentifier值進行的運算是比較(=、<>、<、>、<=、>=)和檢查 NULL(IS NULL 和 IS NOT NULL)。 不允許其他算術運算子。
Guid 和 SqlGuid 都有一個 CompareTo 方法來比較不同的 GUID 值。 不過, System.Guid.CompareTo 和 SqlTypes.SqlGuid.CompareTo 會以不同的方式實作。
SqlGuid 透過 SQL Server 的行為來實作 CompareTo,在值的最後六個字節是最重要的。
Guid 會評估所有16個字節。 下列範例示範此行為差異。 程序代碼的第一個區段會顯示未排序 Guid 的值,而程式代碼的第二個區段會顯示已 Guid 排序的值。 第三個區段會顯示已 SqlGuid 排序的值。 輸出會顯示在程式代碼清單下方。
static void WorkWithGuids()
{
// Create an ArrayList and fill it with Guid values.
ArrayList guidList = new()
{
new Guid("3AAAAAAA-BBBB-CCCC-DDDD-2EEEEEEEEEEE"),
new Guid("2AAAAAAA-BBBB-CCCC-DDDD-1EEEEEEEEEEE"),
new Guid("1AAAAAAA-BBBB-CCCC-DDDD-3EEEEEEEEEEE")
};
// Display the unsorted Guid values.
Console.WriteLine("Unsorted Guids:");
foreach (Guid guidValue in guidList)
{
Console.WriteLine($" {guidValue}");
}
Console.WriteLine("");
// Sort the Guids.
guidList.Sort();
// Display the sorted Guid values.
Console.WriteLine("Sorted Guids:");
foreach (Guid guidSorted in guidList)
{
Console.WriteLine($" {guidSorted}");
}
Console.WriteLine("");
// Create an ArrayList of SqlGuids.
ArrayList sqlGuidList = new()
{
new SqlGuid("3AAAAAAA-BBBB-CCCC-DDDD-2EEEEEEEEEEE"),
new SqlGuid("2AAAAAAA-BBBB-CCCC-DDDD-1EEEEEEEEEEE"),
new SqlGuid("1AAAAAAA-BBBB-CCCC-DDDD-3EEEEEEEEEEE")
};
// Sort the SqlGuids. The unsorted SqlGuids are in the same order
// as the unsorted Guid values.
sqlGuidList.Sort();
// Display the sorted SqlGuids. The sorted SqlGuid values are ordered
// differently than the Guid values.
Console.WriteLine("Sorted SqlGuids:");
foreach (SqlGuid sqlGuidValue in sqlGuidList)
{
Console.WriteLine($" {sqlGuidValue}");
}
}
Private Sub WorkWithGuids()
' Create an ArrayList and fill it with Guid values.
Dim guidList As New ArrayList()
guidList.Add(New Guid("3AAAAAAA-BBBB-CCCC-DDDD-2EEEEEEEEEEE"))
guidList.Add(New Guid("2AAAAAAA-BBBB-CCCC-DDDD-1EEEEEEEEEEE"))
guidList.Add(New Guid("1AAAAAAA-BBBB-CCCC-DDDD-3EEEEEEEEEEE"))
' Display the unsorted Guid values.
Console.WriteLine("Unsorted Guids:")
For Each guidValue As Guid In guidList
Console.WriteLine("{0}", guidValue)
Next
Console.WriteLine()
' Sort the Guids.
guidList.Sort()
' Display the sorted Guid values.
Console.WriteLine("Sorted Guids:")
For Each guidSorted As Guid In guidList
Console.WriteLine("{0}", guidSorted)
Next
Console.WriteLine()
' Create an ArrayList of SqlGuids.
Dim sqlGuidList As New ArrayList()
sqlGuidList.Add(New SqlGuid("3AAAAAAA-BBBB-CCCC-DDDD-2EEEEEEEEEEE"))
sqlGuidList.Add(New SqlGuid("2AAAAAAA-BBBB-CCCC-DDDD-1EEEEEEEEEEE"))
sqlGuidList.Add(New SqlGuid("1AAAAAAA-BBBB-CCCC-DDDD-3EEEEEEEEEEE"))
' Sort the SqlGuids. The unsorted SqlGuids are in the same order
' as the unsorted Guid values.
sqlGuidList.Sort()
' Display the sorted SqlGuids. The sorted SqlGuid values are
' ordered differently than the Guid values.
Console.WriteLine("Sorted SqlGuids:")
For Each sqlGuidValue As SqlGuid In sqlGuidList
Console.WriteLine("{0}", sqlGuidValue)
Next
End Sub
此範例會產生下列結果。
Unsorted Guids:
3aaaaaaa-bbbb-cccc-dddd-2eeeeeeeeeee
2aaaaaaa-bbbb-cccc-dddd-1eeeeeeeeeee
1aaaaaaa-bbbb-cccc-dddd-3eeeeeeeeeee
Sorted Guids:
1aaaaaaa-bbbb-cccc-dddd-3eeeeeeeeeee
2aaaaaaa-bbbb-cccc-dddd-1eeeeeeeeeee
3aaaaaaa-bbbb-cccc-dddd-2eeeeeeeeeee
Sorted SqlGuids:
2aaaaaaa-bbbb-cccc-dddd-1eeeeeeeeeee
3aaaaaaa-bbbb-cccc-dddd-2eeeeeeeeeee
1aaaaaaa-bbbb-cccc-dddd-3eeeeeeeeeee
另請參閱
- SQL Server 資料類型和 ADO.NET
- ADO.NET 概觀