2012-06-27 33 views
6

que crear una tabla de consulta a continuaciónSQL restricción servidor expresión regular

CREATE TABLE testing(
    test_field VARCHAR(20) CHECK(test_field like '^[a-zA-z0-9]{6,20}$') 
); 

la expresión regular está trabajando en Javascript y la mesa se ha creado correctamente, pero cuando se intenta ejecutar la consulta de inserción a continuación, se produjo el error .

INSERT INTO testing VALUES('abcde12345'); 

mensaje El error es una lista

La sentencia INSERT en conflicto con la restricción CHECK "CK_ prueba _test_field__173876EA". El conflicto ocurrió en la base de datos "TEST", tabla "dbo.testing", columna "test_field".

¿Hay alguna diferencia entre utilizar Regular Expression en JavaScript y SQL Server?

¿Algún pro puede ayudar?

+2

Véase el artículo aquí: http: //blogs.lessthandot. com/index.php/DataMgmt/DBProgramming/sql-server-does-support-regular-expressi –

+0

David, por lo que puedo ver, solo comprueba con una expresión de comodín 'LIKE' y su caso de uso es bastante simple para eso. Este no es – Joey

+0

http://stackoverflow.com/questions/267921/regular-expressions-in-sql-server-servers No obstante, no estoy seguro de si realmente está activando la característica de expresión regular. – nhahtdh

Respuesta

4

LIKE does not use regular expressions.

Puede añadir soporte para expresiones regulares a SQL Server mediante la creación de sus propias funciones. Un método a través de .NET se detalla en this article.

En su caso también se puede intentar lo siguiente, pero no es bastante:

test_field LIKE '[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]' 
OR test_field LIKE '[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]' 
OR test_field LIKE '[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]' 
OR test_field LIKE '[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]' 
OR test_field LIKE '[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]' 
OR test_field LIKE '[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]' 
OR test_field LIKE '[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]' 
OR test_field LIKE '[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]' 
OR test_field LIKE '[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]' 
OR test_field LIKE '[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]' 
OR test_field LIKE '[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]' 
OR test_field LIKE '[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]' 
OR test_field LIKE '[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]' 
OR test_field LIKE '[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]' 
OR test_field LIKE '[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]' 
+0

¿qué debo hacer si quiero agregar una expresión regular en el constrant? –

+0

Ok, consígalo, gracias de todos modos :) –

+0

El segundo enlace es incorrecto (¿ya?) – Jviaches

1

SQL Server no admite POSIX regular expressions, pero sólo un subconjunto.

Ver here para más detalles.

+2

Las expresiones 'LIKE' no son un subconjunto de ningún sabor regex. Funcionan de manera diferente (es decir, no se incluyen los conceptos de tokens y cuantificadores) – Joey

+1

LIKE pattern puede usar comodines que coincidan con" Cualquier cadena de cero o más caracteres. "," Cualquier carácter individual dentro del rango especificado ([af]) o set ([abcdef]) "," Cualquier carácter individual que no esté dentro del rango especificado ([^ af]) o conjunto ([^ abcdef]) ".En mi humilde opinión, este es un subconjunto del conjunto de caracteres regex y las expresiones braket. –

+0

Los comodines '%' y '_' se pueden representar en expresiones regulares con'. * 'O' .', pero especialmente el primero tiene un único significado en comodines mientras que es un token con un cuantificador en expresiones regulares. Para mí, son dos conceptos muy diferentes (sí, las expresiones de paréntesis son idénticas). Por supuesto, los comodines pueden describir un conjunto de idiomas que es un subconjunto de idiomas regulares, pero eso no significa que el lenguaje utilizado para describirlos sea un subconjunto de expresiones regulares. A mis ojos, no es porque use una sintaxis muy diferente (e incluso diferentes metacaracteres). – Joey

1

Hay una solución para esto. Puesto que usted quiere comprobar todos los personajes, puede generar la expresión regular con la réplica:

SET @pattern = replicate('[a-zA-Z0-9]', LEN(@VAL)); 

Ésta es una función completa alrededor de este corte:

create function dbo.example (@VAL varchar(32)) 
RETURNS bit 
WITH EXECUTE AS CALLER 
AS 
BEGIN 
    DECLARE @pattern varchar(512); 
    SET @pattern = replicate('[a-zA-Z0-9]', LEN(@VAL)); 
    IF @VAL like @pattern 
    BEGIN 
     RETURN 1; 
    END; 
    RETURN 0; 
END; 
GO