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)
小智 58
不是我的,在网上找到了......我以为我会分享.
SELECT 1 WHERE @StringToCompare LIKE
REPLACE('00000000-0000-0000-0000-000000000000', '0', '[0-9a-fA-F]');
Run Code Online (Sandbox Code Playgroud)
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)
| 归档时间: |
|
| 查看次数: |
49946 次 |
| 最近记录: |