sql - significado - ¿Cómo comprobar si una cadena es un identificador único?
nombre unico base de datos (12)
Al igual que para mantenerlo simple. Un GUID tiene cuatro, incluso si solo es una cadena
DONDE la columna como ''% -% -% -% -%''
¿Hay un equivalente a IsDate o IsNumeric para el identificador único (SQL Server)? ¿O hay algo equivalente a (C #) TryParse?
De lo contrario, tendré que escribir mi propia función, pero quiero asegurarme de que no estoy reinventando la rueda.
El escenario que estoy tratando de cubrir es el siguiente:
SELECT something FROM table WHERE IsUniqueidentifier(column) = 1
Aunque un post más antiguo, solo un pensamiento para una prueba rápida ...
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
Esta es una función basada en el concepto de algunos comentarios anteriores. Esta función es muy rápida.
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!
*/
No mío, encontré esto en línea ... pensé que iba a compartir.
SELECT 1 WHERE @StringToCompare LIKE
REPLACE(''00000000-0000-0000-0000-000000000000'', ''0'', ''[0-9a-fA-F]'');
No tengo conocimiento de nada que pueda usar "fuera de la caja". Me temo que tendrá que escribir esto por su cuenta.
Si puede: intente escribir esto dentro de una biblioteca de C # e implementarlo en SQL Server como un conjunto SQL-CLR, entonces podría usar cosas como Guid.TryParse()
que ciertamente es mucho más fácil de usar que cualquier otra cosa en T-SQL. ...
Puedes escribir tu propia UDF. Esta es una aproximación simple para evitar el uso de un conjunto 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
Luego puedes mejorarlo para verificar si se trata solo de valores HEX.
SQL Server 2012 hace que todo sea mucho más fácil con TRY_CONVERT(UNIQUEIDENTIFIER, expression)
SELECT something
FROM your_table
WHERE TRY_CONVERT(UNIQUEIDENTIFIER, your_column) IS NOT NULL;
Para versiones anteriores de SQL Server, las respuestas existentes faltan algunos puntos, lo que significa que pueden no coincidir con las cadenas que, de hecho, SQL Server convertirá en UNIQUEIDENTIFIER
sin quejas o puede que aún termine causando errores de UNIQUEIDENTIFIER
no válidos.
SQL Server acepta GUID envueltos en {}
o sin esto.
Además, ignora los caracteres extraños al final de la cadena. Tanto SELECT CAST(''{5D944516-98E6-44C5-849F-9C277833C01B}ssssssssss'' as uniqueidentifier)
y SELECT CAST(''5D944516-98E6-44C5-849F-9C277833C01BXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'' as uniqueidentifier)
tener éxito, por ejemplo.
En la mayoría de las intercalaciones predeterminadas, LIKE ''[a-zA-Z0-9]''
terminará haciendo coincidir los caracteres, como À
o Ë
Finalmente, si la conversión de filas en un resultado a identificador único es importante poner el intento de conversión en una expresión de caso, ya que la conversión puede ocurrir antes de que las filas sean filtradas por el WHERE
.
Entonces (tomando prestada la idea de @ r0d30b0y ) una versión un poco más robusta podría ser
;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 + ''}%''
Tuve algunos usuarios de prueba que se generaron con AutoFixture, que utiliza GUID de forma predeterminada para los campos generados. Los campos de Mi Nombre para los usuarios que necesito eliminar son los GUID o los identificadores únicos. Así es como terminé aquí.
Tuve la oportunidad de improvisar algunas de sus respuestas en esto.
SELECT UserId FROM [Membership].[UserInfo] Where TRY_CONVERT(uniqueidentifier, FirstName) is not null
Una variante de r0d30b0y respuesta es usar PATINDEX para encontrar dentro de una cadena ...
PATINDEX(''%''+REPLACE(''00000000-0000-0000-0000-000000000000'', ''0'', ''[0-9a-fA-F]'')+''%'',@StringToCompare) > 0
Tenía que usar para encontrar Guids dentro de una cadena de URL.
HTH
Dave
Usa RLIKE para MYSQL
SELECT 1 WHERE @StringToCompare
RLIKE REPLACE(''00000000-0000-0000-0000-000000000000'', ''0'', ''[0-9a-fA-F]'');
Yo suelo :
ISNULL(convert(nvarchar(50), userID), ''NULL'') = ''NULL''
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]'';
ACTUALIZAR:
... pero prefiero el enfoque en la respuesta por @ r0d30b0y:
SELECT something
FROM table1
WHERE column1 LIKE REPLACE(''00000000-0000-0000-0000-000000000000'', ''0'', ''[0-9a-fA-F]'');