How to check if a string is a uniqueidentifier?

前端 未结 12 859
小蘑菇
小蘑菇 2020-11-29 03:06

Is there an equivalent to IsDate or IsNumeric for uniqueidentifier (SQL Server)? Or is there anything equivalent to (C#) TryParse?

Otherwise I\'ll have to write my o

相关标签:
12条回答
  • 2020-11-29 03:40

    I had some Test users that were generated with AutoFixture, which uses GUIDs by default for generated fields. My FirstName fields for the users that I need to delete are GUIDs or uniqueidentifiers. That's how I ended up here.

    I was able to cobble together some of your answers into this.

    SELECT UserId FROM [Membership].[UserInfo] Where TRY_CONVERT(uniqueidentifier, FirstName) is not null

    0 讨论(0)
  • 2020-11-29 03:41

    Like to keep it simple. A GUID has four - in it even, if is just a string

    WHERE column like '%-%-%-%-%'

    0 讨论(0)
  • 2020-11-29 03:41

    You can write your own UDF. This is a simple approximation to avoid the use of a SQL-CLR assembly.

    CREATE FUNCTION dbo.isuniqueidentifier (@ui varchar(50))  
    RETURNS bit AS  
    BEGIN
    
    RETURN case when
        substring(@ui,9,1)='-' and
        substring(@ui,14,1)='-' and
        substring(@ui,19,1)='-' and
        substring(@ui,24,1)='-' and
        len(@ui) = 36 then 1 else 0 end
    
    END
    GO
    

    You can then improve it to check if it´s just about HEX values.

    0 讨论(0)
  • 2020-11-29 03:46

    Use RLIKE for MYSQL

    SELECT 1 WHERE @StringToCompare
    RLIKE REPLACE('00000000-0000-0000-0000-000000000000', '0', '[0-9a-fA-F]');
    
    0 讨论(0)
  • 2020-11-29 03:47

    SQL Server 2012 makes this all much easier with TRY_CONVERT(UNIQUEIDENTIFIER, expression)

    SELECT something
    FROM   your_table
    WHERE  TRY_CONVERT(UNIQUEIDENTIFIER, your_column) IS NOT NULL;
    

    For prior versions of SQL Server, the existing answers miss a few points that mean they may either not match strings that SQL Server will in fact cast to UNIQUEIDENTIFIER without complaint or may still end up causing invalid cast errors.

    SQL Server accepts GUIDs either wrapped in {} or without this.

    Additionally it ignores extraneous characters at the end of the string. Both SELECT CAST('{5D944516-98E6-44C5-849F-9C277833C01B}ssssssssss' as uniqueidentifier) and SELECT CAST('5D944516-98E6-44C5-849F-9C277833C01BXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' as uniqueidentifier) succeed for instance.

    Under most default collations the LIKE '[a-zA-Z0-9]' will end up matching characters such as À or Ë

    Finally if casting rows in a result to uniqueidentifier it is important to put the cast attempt in a case expression as the cast may occur before the rows are filtered by the WHERE.

    So (borrowing @r0d30b0y's idea) a slightly more robust version might be

    ;WITH T(C)
         AS (SELECT '5D944516-98E6-44C5-849F-9C277833C01B'
             UNION ALL
             SELECT '{5D944516-98E6-44C5-849F-9C277833C01B}'
             UNION ALL
             SELECT '5D944516-98E6-44C5-849F-9C277833C01BXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
             UNION ALL
             SELECT '{5D944516-98E6-44C5-849F-9C277833C01B}ssssssssss'
             UNION ALL
             SELECT 'ÀD944516-98E6-44C5-849F-9C277833C01B'
             UNION ALL
             SELECT 'fish')
    SELECT CASE
             WHEN C LIKE expression + '%'
                   OR C LIKE '{' + expression + '}%' THEN CAST(C AS UNIQUEIDENTIFIER)
           END
    FROM   T
           CROSS APPLY (SELECT REPLACE('00000000-0000-0000-0000-000000000000', '0', '[0-9a-fA-F]') COLLATE Latin1_General_BIN) C2(expression)
    WHERE  C LIKE expression + '%'
            OR C LIKE '{' + expression + '}%' 
    
    0 讨论(0)
  • 2020-11-29 03:47

    Not mine, found this online... thought i'd share.

    SELECT 1 WHERE @StringToCompare LIKE 
           REPLACE('00000000-0000-0000-0000-000000000000', '0', '[0-9a-fA-F]');
    
    0 讨论(0)
提交回复
热议问题