2012-09-27 24 views
1

我有這個表..的IF檢查約束SQL裏面

CREATE TABLE [dbo].[Tipo_Servicios_Info](
[TSI_TS_Id] [int] NOT NULL, 
[TS_Tar_Id] [int] NOT NULL, 
[TS_PDI_Id] [int] NOT NULL, 
[TSI_Descripcion] varchar(100), 
[TSI_FechaIni] date not null, 
[TSI_FechaFin] date not null, 
[TSI_HoraMin] time, 
[TSI_HoraMax] time, 
[TSI_Duracion] varchar(50) not null, 
[TSI_Unidad] varchar(50) not null, 
[TSI_Cantidad] int not null, 

CONSTRAINT [PK_TIPO_SERVICIOS_INFO] PRIMARY KEY CLUSTERED 
(
[TSI_TS_Id] ASC, 
[TS_Tar_Id] ASC, 
[TS_PDI_Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
     ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

隨着一些檢查..

ALTER TABLE Dbo.Tipo_Servicios_Info 
ADD CONSTRAINT Ck_Valores_Unidad CHECK(Tsi_Unidad IN('Dia', 'Hora')); 
GO 

ALTER TABLE Dbo.Tipo_Servicios_Info 
ADD CONSTRAINT Df_Tipo_Servicios_Info_Tsi_Unidad DEFAULT 'Dia' FOR Tsi_Unidad; 
GO 

在這上面兩個我設置爲TSI_Unidad爲「直徑的默認值',但是這個字段只能通過第二個約束包含Dia或Hora。

但我有一個問題,我必須定義TSI_HoraMin和TSI_HoraMax可以爲空(如果TSI_Unidad是直徑,他們必須爲可以爲空),但如果TSI_Unidad是霍拉[TSI_HoraMin]和[TSI_HoraMax]不能爲空。

我想創建一個新的約束,但我不知道我該怎麼辦呢..

這將是想法..

ALTER TABLE [dbo].[Tipo_Servicios_Info] 
ADD CONSTRAINT CK_HorasMin CHECK([TSI_HoraMin] is not null if [TSI_Unidad] = 'Hora') 
GO 

但這種約束,很明顯,心不是很好的定義。

回答

5

從我收集的內容來看,如果TSI_Unidad ='Hora`,您試圖不允許TSI_HoraMin爲空值。在這種情況下,您可以使用:

ALTER TABLE [dbo].[Tipo_Servicios_Info] 
ADD CONSTRAINT CK_HorasMin 
CHECK(NOT([TSI_HoraMin] IS NULL AND [TSI_Unidad] = 'Hora')); 
+0

完美的GarethD! ;) 謝謝。 – bombai