如何检查字符串是否是唯一标识符?

Ben*_*ttr 51 sql sql-server

uniqueidentifier(SQL Server)是否等效于IsDate或IsNumeric?或者有什么等同于(C#)TryParse?

否则我将不得不编写自己的功能,但我想确保我不会重新发明轮子.

我想要涵盖的场景如下:

SELECT something FROM table WHERE IsUniqueidentifier(column) = 1
Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 69

SQL Server 2012使这一切变得更加容易 TRY_CONVERT(UNIQUEIDENTIFIER, expression)

SELECT something
FROM   your_table
WHERE  TRY_CONVERT(UNIQUEIDENTIFIER, your_column) IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)

对于SQL Server的早期版本,现有的答案会遗漏几个点,这意味着它们可能与SQL Server实际上UNIQUEIDENTIFIER没有投诉的字符串不匹配,或者最终可能导致无效的投射错误.

SQL Server接受包含{}或不包含的GUID .

另外,它会忽略字符串末尾的无关字符.无论SELECT CAST('{5D944516-98E6-44C5-849F-9C277833C01B}ssssssssss' as uniqueidentifier)SELECT CAST('5D944516-98E6-44C5-849F-9C277833C01BXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' as uniqueidentifier)例如成功.

在大多数默认排序规则下,LIKE '[a-zA-Z0-9]'最终会匹配字符,例如ÀË

最后,如果将结果中的行转换为uniqueidentifier,则将转换尝试放在case表达式中非常重要,因为转换可能在行被过滤之前发生WHERE.

所以(借用@ r0d30b0y的想法)可能会有一个更强大的版本

;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 + '}%' 
Run Code Online (Sandbox Code Playgroud)

  • 只是有一个时刻在StackOverflow上看到了我的一天的答案.不知怎的,我没有看到TRY_CONVERT存在. (4认同)
  • 如果您不需要style参数,还有[`TRY_CAST`](https://msdn.microsoft.com/en-us/library/hh974669.aspx).[`TRY_PARSE`](https://msdn.microsoft.com/en-us/library/hh213126.aspx)不支持`uniqueidentifier`,因此不需要考虑它. (3认同)

小智 58

不是我的,在网上找到了......我以为我会分享.

SELECT 1 WHERE @StringToCompare LIKE 
       REPLACE('00000000-0000-0000-0000-000000000000', '0', '[0-9a-fA-F]');
Run Code Online (Sandbox Code Playgroud)

  • 不错,但是所有这些零都可能导致难以追踪的拼写错误:).恕我直言,这是你的想法略有改进,确保空UNIQUEIDENTIFIER的格式是正确的:`SELECT 1 WHERE @StringToCompare LIKE替换(演员(演员(0 AS BINARY)AS UNIQUEIDENTIFIER),'0','[0-9a -Fa-F]');` (3认同)

one*_*hen 24

SELECT something 
  FROM table1 
 WHERE column1 LIKE '[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]-[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]-[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]-[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]-[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]';
Run Code Online (Sandbox Code Playgroud)

更新:

...但我更喜欢@ r0d30b0y的答案中的方法:

SELECT something 
  FROM table1 
 WHERE column1 LIKE REPLACE('00000000-0000-0000-0000-000000000000', '0', '[0-9a-fA-F]');
Run Code Online (Sandbox Code Playgroud)