Puede almacenar esto como un campo de bits y luego usar operadores lógicos booleanos para recuperar los valores
por ejemplo:
CREATE TABLE [dbo].[testBF](
[field1] [varchar](max) NOT NULL,
[field2] [varchar](max) NOT NULL,
[bitfield] [int] NOT NULL CONSTRAINT [DF_testBF_bitfield] DEFAULT ((0))
) ON [PRIMARY]
Luego para selecciones:
SELECT field1, field2,
CASE WHEN (bitfield & 1) = 1 THEN 'monday ' ELSE '' END +
CASE WHEN (bitfield & 2) = 2 THEN 'tuesday ' ELSE '' END +
CASE WHEN (bitfield & 4) = 4 THEN 'wednesday ' ELSE '' END +
CASE WHEN (bitfield & 8) = 8 THEN 'thursday ' ELSE '' END +
CASE WHEN (bitfield & 16) = 16 THEN 'friday' ELSE '' END as [days of week]
FROM testBF
Para encontrar todos los días que contienen la bandera de martes (martes es el segundo bit o 2^1 o 2)
SELECT *
FROM aTable
WHERE (bitfield & 2) = 2
o
SELECT *
FROM aTable
WHERE (bitfield & 2) != 0
Tenga en cuenta que la plantilla en el segundo caso funcionará para cualquier bit, es decir, para el viernes (el quinto bit o 2^4 o 16) sería
SELECT *
FROM aTable
WHERE (bitfield & 16) != 0
Finalmente, el caso general... pasa un número (1 para el lunes) que obtienes
SELECT *
FROM aTable
WHERE (bitfield & POWER(2,@inNumOfWeekday-1)) != 0
Esto me parece mucho trabajo, cuando podría guardarlo como campos de 5 (o 7 bits), pero así es como podría hacerlo.
Para obtener más ejemplos, consulte la esencia que escribí para otra pregunta:
https://gist.github.com/1846338
y la respuesta:
https://stackoverflow.com/a/9302106/215752