¿Cómo me aseguro de que una columna de cadena no tenga espacios?

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

preguntado el 22 de mayo de 12 a las 19:05

COMPRUEBE (ÍNDICE DE CARÁCTER (key_column, ' ') = 0) -

1 Respuestas

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.):

  1. En el Explorador de objetos, haga clic derecho en su tabla y seleccione Diseño
  2. Haga clic derecho en su columna en la cuadrícula superior y seleccione Comprobar restricciones...
  3. Presione Agregar
  4. Tipo column_name NOT LIKE '% %' en el cuadro "Expresión" (use su nombre de columna real, no column_name)
  5. 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)
  6. Presione Cerrar
  7. 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 or haz tu propia pregunta.