2012-03-15 15 views
5

Me cansé de agregar una Restricción de verificación y solo he fallado hasta el momento. ¿Cuál sería la manera de evitar esto:Restricción de verificación - Las subconsultas no están permitidas en este contexto

Msg 1046, nivel 15, estado 1, línea 6

subconsultas no están permitidos en este contexto. Solo se permiten las expresiones escalares .

Este es el código:

ALTER TABLE dbo.PropertySeasonDiscount ADD CONSTRAINT 
[CC_PropertySeasonDiscount_MadeFrom_MadeTo] 
CHECK (
    (SELECT COUNT(PropertySeasonDiscountId) FROM dbo.PropertySeasonDiscounts apsdeb 
     WHERE 
      (apsdeb.PropertySeasonId = PropertySeasonId) AND 
      (
       (apsdeb.ValidForReservationsMadeTo >= ValidForReservationsMadeFrom AND ValidForReservationsMadeFrom >= apsdeb.ValidForReservationsMadeFrom) OR 
       (apsdeb.ValidForReservationsMadeFrom <= ValidForReservationsMadeTo AND ValidForReservationsMadeTo <= apsdeb.ValidForReservationsMadeTo) 
      ) 
    ) = 0 
); 
+0

¿Qué tal un gatillo? –

+0

@AaronBertrand Pongo la lógica dentro de una UDF y devuelvo el valor de esa UDF. Luego lo comparé con la restricción y no me quejé. Disparar sería mejor? – tugberk

+0

@AaronBertrand No se quejó cuando creé, pero actúa inesperadamente cuando trato de agregar valor a la tabla. – tugberk

Respuesta

10

SQL Server actualmente no support subqueries for CHECK CONSTRAINTs.

Como ha descubierto, puede haber trouble with CHECK constraints que impliquen UDF cuando se intenta eludir la limitación de subconsulta.

Las estrategias de implementación de restricciones alternativas son provocados procesal y procedimental incrustado. El primero es preferido porque, al igual que las restricciones declarativas, no se pueden eludir.

La implementación de una estrategia de procedimiento desencadenada que está bien optimizada y maneja los problemas de concurrencia no es trivial, pero aún es factible. Recomiendo encarecidamente el libro Applied Mathematics for Database Professionals By Lex de Haan, Toon Koppelaars, capítulo 11 (los ejemplos del código son Oracle pero pueden ser fácilmente portados a SQL Server).

3

Como ya se ha mencionado, este tipo de restricciones de comprobación aún no se implementa en SQL-Server. Además de los factores desencadenantes, también podría examinar la posibilidad de cambiar el diseño de la tabla.

Una posible alternativa incluye almacenar la fecha de finalización del intervalo anterior en cada fila. Ver Storing intervals of time with no overlaps para más detalles. Las restricciones de cumplimiento son simples, pero existen complicaciones en la forma en que tendrá que lidiar con Inserts/Deletes/Updates en la tabla.

Otra posibilidad sería almacenar no una fila (con fecha de inicio y final) para un descuento como lo hace ahora, sino toda una serie de filas (una para cada fecha del intervalo de descuento). Las restricciones de cumplimiento serán incluso más simples, pero tendrá muchas filas en lugar de cada una de su tabla actual.

Cuestiones relacionadas