uniqueidentifier(SQL Server)是否等效于IsDate或IsNumeric? 或者有什么等同于(C#)TryParse?
否则我将不得不编写自己的功能,但我想确保我不会重新发明轮子。
我想要介绍的方案如下:
SELECT something FROM table WHERE IsUniqueidentifier(column) = 1
答案 0 :(得分:59)
使用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,则将转换尝试放在case表达式中非常重要,因为在WHERE
过滤行之前可能会发生转换。
所以(借用@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 + '}%'
答案 1 :(得分:56)
不是我的,在网上找到了...以为我会分享。
SELECT 1 WHERE @StringToCompare LIKE
REPLACE('00000000-0000-0000-0000-000000000000', '0', '[0-9a-fA-F]');
答案 2 :(得分:23)
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]');
答案 3 :(得分:4)
我不知道任何你可以“开箱即用”的东西 - 你必须自己写这个,我害怕。
如果你可以:尝试在C#库中编写它并将其作为SQL-CLR程序集部署到SQL Server中 - 那么你可以使用像Guid.TryParse()
这样的东西,它肯定比T中的任何东西都容易使用-SQL ....
答案 4 :(得分:2)
r0d30b0y答案的变体是使用PATINDEX在字符串中查找...
PATINDEX('%'+REPLACE('00000000-0000-0000-0000-000000000000', '0', '[0-9a-fA-F]')+'%',@StringToCompare) > 0
必须用于在URL字符串中查找Guids ..
HTH
戴夫
答案 5 :(得分:2)
喜欢保持简单。 GUID有四个 - 在它中甚至,如果只是一个字符串
WHERE列如'% - % - % - % - %'
答案 6 :(得分:1)
这是一个基于一些早期评论概念的函数。这个功能非常快。
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!
*/
答案 7 :(得分:1)
虽然是一篇较老的帖子,但只是想快速测试...
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
答案 8 :(得分: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值。
答案 9 :(得分:0)
我用:
ISNULL(convert(nvarchar(50), userID), 'NULL') = 'NULL'
答案 10 :(得分:0)
我有一些使用AutoFixture生成的测试用户,默认情况下会为生成的字段使用GUID。我需要删除的用户的My FirstName字段是GUID或uniqueidentifier。这就是我在这里结束的方式。
我能够将你的一些答案凑到一起。
SELECT UserId FROM [Membership].[UserInfo] Where TRY_CONVERT(uniqueidentifier, FirstName) is not null
答案 11 :(得分:0)
将RLIKE用于MYSQL
SELECT 1 WHERE @StringToCompare
RLIKE REPLACE('00000000-0000-0000-0000-000000000000', '0', '[0-9a-fA-F]');
答案 12 :(得分:0)
DECLARE @guid_string nvarchar(256) = 'ACE79678-61D1-46E6-93EC-893AD559CC78'
SELECT
CASE WHEN @guid_string LIKE '________-____-____-____-____________'
THEN CONVERT(uniqueidentifier, @guid_string)
ELSE NULL
END