unico significado que nombre longitud informatica incompleta identificadores identificador ejemplo definicion datos sql sql-server

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]'');