語言

比較 GUID 和 唯一識別碼 值

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  

另請參閱