如何检查一个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