uniqueidentifier(SQL Server)是否有与IsDate或IsNumeric等效的名称?
否则,我将不得不编写自己的函数,但我想确保我没有重新发明轮子.
我试图讲述的场景如下:
SELECT something FROM table WHERE IsUniqueidentifier(column) = 1
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 + '}%'