如何检查一个string是否是唯一标识符?

是否有与IsDate或IsNumeric等价的uniqueidentifier(SQL Server)? 还是有什么相当于(C#)TryParse?

否则,我将不得不写我自己的function,但我想确保我没有重新发明轮子。

我试图覆盖的情况如下:

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而没有投诉的string,也可能最终导致无效的转换错误。

SQL Server接受包装在{} GUID或者不包含这个GUID。

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

在大多数默认sorting规则下, LIKE '[a-zA-Z0-9]'将结束匹配字符,如“ À或“ Ë

最后,如果将结果中的行转换为uniqueidentifier,则必须将转换尝试放在caseexpression式中,因为在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 + '}%' 

不是我的,发现这个在线…以为我会分享。

 SELECT 1 WHERE @StringToCompare LIKE REPLACE('00000000-0000-0000-0000-000000000000', '0', '[0-9a-fA-F]'); 
 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]'; 

更新:

…但我更喜欢@ r0d30b0y的答案:

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

我不知道你可以使用任何“开箱即用” – 恐怕你必须自己写这个。

如果可以的话:尝试在C#库中编写它,并将其作为一个SQL-CLR程序集部署到SQL Server中,然后使用Guid.TryParse()这些比T-SQL中的任何东西都更容易使用的东西。 …

r0d30b0y答案的变种是使用PATINDEX在string中查找…

 PATINDEX('%'+REPLACE('00000000-0000-0000-0000-000000000000', '0', '[0-9a-fA-F]')+'%',@StringToCompare) > 0 

不得不使用在URLstring中查找Guids ..

HTH

戴夫

喜欢保持简单。 一个GUID甚至有四个 – 如果只是一个string

WHERE列如'% – % – % – % – %'

虽然一个较旧的post,只是一个快速testing的想法…

 SELECT [A].[INPUT], CAST([A].[INPUT] AS [UNIQUEIDENTIFIER]) FROM ( SELECT '5D944516-98E6-44C5-849F-9C277833C01B' Collate Latin1_General_100_BIN AS [INPUT] 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' ) [A] WHERE PATINDEX('[^0-9A-F-{}]%', [A].[INPUT]) = 0 

你可以编写你自己的UDF。 这是避免使用SQL-CLR程序集的简单近似。

 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 

然后你可以改进它来检查它是否仅仅是HEX值。

我用 :

 ISNULL(convert(nvarchar(50), userID), 'NULL') = 'NULL' 

这是基于一些较早的评论的概念的function。 这个function非常快。

 CREATE FUNCTION [dbo].[IsGuid] (@input varchar(50)) RETURNS bit AS BEGIN RETURN case when @input 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]' then 1 else 0 end END GO /* Usage: select [dbo].[IsGuid]('123') -- Returns 0 select [dbo].[IsGuid]('ebd8aebd-7ea3-439d-a7bc-e009dee0eae0') -- Returns 1 select * from SomeTable where dbo.IsGuid(TableField) = 0 -- Returns table with all non convertable items! */ 

我有一些用AutoFixture生成的testing用户,默认情况下GUID是用于生成字段的。 我需要删除的用户的名字字段是GUID或uniqueidentifiers。 我就是这样结束的

我能够把你的一些答案拼凑在一起。

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