type separar por length delimitada data comas cadena sql sql-server-2008 ssms

sql - separar - Restringir la columna varchar() a valores específicos?



type text sql server 2012 (4)

¿Hay alguna manera de especificar, por ejemplo, 4 valores distintos para una columna varchar en MS SQL Server 2008?

Por ejemplo, necesito una columna llamada Frequency (varchar) que solo acepte ''Daily'', ''Weekly'', ''Monthly'', ''Yearly'' como posibles valores

¿Es posible establecerlo en SQL Server Management Studio al crear la tabla?


Cuando estás editando una tabla
Right Click -> Check Constraints -> Add -> Escriba algo como Frequency IN (''Daily'', ''Weekly'', ''Monthly'', ''Yearly'') en el campo de expresión y un buen nombre de restricción en el campo (Nombre).
Estás listo.


Personalmente, lo codificaría como tinyint y:

  • O bien: cámbielo a texto en el cliente, verifique la restricción entre 1 y 4
  • O bien: use una tabla de búsqueda con una clave externa

Razones:

  • Tomará un promedio de 8 bytes para almacenar texto, 1 byte para tinyint. En millones de filas, esto marcará la diferencia.

  • ¿Qué hay de la intercalación? ¿Es "Diario" lo mismo que "DIARIO"? Se necesitan recursos para hacer este tipo de comparación.

  • Finalmente, ¿qué sucede si desea agregar "Cada dos semanas" o "Cada hora"? Esto requiere un cambio de esquema cuando podría simplemente agregar nuevas filas a una tabla de búsqueda.


Quieres una restricción de cheques .

Las restricciones CHECK determinan los valores válidos de una expresión lógica que no se basa en datos de otra columna. Por ejemplo, el rango de valores para una columna de salario se puede limitar creando una restricción CHECK que permita solo datos que oscilan entre $ 15,000 y $ 100,000. Esto evita que los salarios se ingresen más allá del rango de salario regular.

Quieres algo como:

ALTER TABLE dbo.Table ADD CONSTRAINT CK_Table_Frequency CHECK (Frequency IN (''Daily'', ''Weekly'', ''Monthly'', ''Yearly''))

También puede implementar restricciones de verificación con funciones escalares, como se describe en el enlace anterior, que es la forma en que prefiero hacerlo.


¿Ya ha considerado agregar una check constraint en esa columna que restringiría los valores? Algo como:

CREATE TABLE SomeTable ( Id int NOT NULL, Frequency varchar(200), CONSTRAINT chk_Frequency CHECK (Frequency IN (''Daily'', ''Weekly'', ''Monthly'', ''Yearly'')) )