¿Cómo me aseguro de que una columna de cadena no tenga espacios?
Frecuentes
Visto 3,152 veces
5
Actualmente tengo un campo de clave principal de nvarchar(50)
, Estoy dispuesto a cambiar el tipo, si puedo lograr que no acepte espacios en blanco. ¿Hay alguna forma de hacer esto?
Debe permitir lo siguiente:
------
AAAA
BBBB
CCCC
No debe permitir lo siguiente:
------
AA AAA
BBBB B
C CCCC
1 Respuestas
6
Podría agregar la siguiente restricción de verificación:
CHECK LEN(col) = LEN(REPLACE(col, ' ', ''));
...o...
CHECK (col NOT LIKE '% %');
...o...
CHECK (CHARINDEX(' ', col) = 0)
Ejemplo:
USE tempdb;
GO
CREATE TABLE dbo.bar(foo NVARCHAR(50) PRIMARY KEY);
ALTER TABLE dbo.bar ADD CONSTRAINT chkNoSpaces
CHECK (foo NOT LIKE '% %');
Tiene éxito:
INSERT dbo.bar(foo) SELECT 'AAAA';
GO
Falla:
INSERT dbo.bar(foo) SELECT 'AA AA';
GO
Resultados:
Msg 547, nivel 16, estado 0, línea 1
La instrucción INSERT entró en conflicto con la restricción CHECK "chkNoSpaces". El conflicto ocurrió en la base de datos "tempdb", tabla "dbo.bar", columna 'foo'.
La instrucción se ha terminado.
Limpiar:
DROP TABLE dbo.bar;
EDITAR
Si necesita hacer esto a través de la interfaz de usuario por alguna razón (nuevamente, le recomiendo que haga esto con un script que pueda hacer atómico, repetible, guardar en un archivo, almacenar en el control de código fuente, etc.):
- En el Explorador de objetos, haga clic derecho en su tabla y seleccione Diseño
- Haga clic derecho en su columna en la cuadrícula superior y seleccione Comprobar restricciones...
- Presione Agregar
- Tipo
column_name NOT LIKE '% %'
en el cuadro "Expresión" (use su nombre de columna real, nocolumn_name
) - Si cree que ya tiene datos que infringen la restricción, cambie la opción "Comprobar datos existentes..." a No (y rápidamente corrija esos datos)
- Presione Cerrar
- Haga clic en el icono "Guardar" en la barra de herramientas
Tenga en cuenta que la interfaz de usuario en realidad cambia la construcción de la cláusula, por ejemplo (NOT col_name LIKE '% %')
contestado el 22 de mayo de 12 a las 20:05
¿Hay alguna forma de hacer esto en Managment Studio? - Ingeniero de software de Bill
Sí, pero es complicado recorrer todos los cuadros de diálogo de la interfaz de usuario. También es algo que no puede guardar en un script o control de código fuente. ¿Por qué necesita usar Management Studio para hacer esto? - Aarón Bertrand
¿Por qué no?: CHECK CHARINDEX(N' ',col) = 0 Me gusta el truco de comparar estas longitudes para contar ocurrencias, pero parece que CHARINDEX solo debería escanear la cadena una vez (como máximo) y REPLACE y dos Los LEN parecen más caros sin conocer las partes internas. - GilM
Ok, le daré una oportunidad a esto. Gracias. Aprobaré esta respuesta cuando esté disponible. - Ingeniero de software de Bill
@AaronBertrand Estoy de acuerdo, pero pensé en llamarlo para que el cartel sea consciente del comportamiento real. Me ha picado la "función" de recorte de LEN, por lo que suena una alarma en mi cabeza cada vez que la veo. - GilM
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas sql-server-2008 tsql ssms or haz tu propia pregunta.
COMPRUEBE (ÍNDICE DE CARÁCTER (key_column, ' ') = 0) - Mithrandir