uniqueidentifier(SQL Server)是否有与IsDate或IsNumeric等效的名称?

否则,我将不得不编写自己的函数,但我想确保我没有重新发明轮子.

我试图讲述的场景如下:

SELECT something FROM table WHERE IsUniqueidentifier(column) = 1

推荐答案

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

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

对于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,则必须将强制转换try 放在大小写表达式中,因为强制转换可能在行被WHERE过滤之前发生.

所以(borrow @r0d30b0y's idea)一个稍微更健壮的版本可能是

;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 + '}%' 

Sql相关问答推荐

使用Mac日志(log)时间找出SQL中的好小时和坏小时

如何从多行数据中获取一行合并数据?

从自定义日期和时间开始,每月具有给定状态的公司数量

解析SQL Server中的嵌套JSON

Django将字符串筛选为整数?

每年独特口味的冰淇淋数量

仅当交叉应用返回单值时才更新记录

在PostgreSQL中汇总连接表中的 case 值

将时间范围划分为全天和前后剩余小时

在 R 值的 SQL 块中显示值

DbUp for sqlserver 在 dbo 授权下为非 dbo 用户创建架构

通过ID和数据找到每个不同的值

Postgresql 具有相似行为和模式行为的问题

如何使用SQL将患者平均分配给他们所在地区的doctor

正则表达式:停在第一个匹配的其中一个字符位置上

Postgresql 需要一个查询,为我提供所有没有具有特定状态值的子元素的父母

SQLite 中的过滤运行总和视图

PostgreSQL 如何在一组项目及其数量上找到完全相同的订单?

PostgreSQL Select 具有两列的自引用

除以表中的几个元素