2017-07-07 40 views
0

我正在數據庫中構建一個代碼簿。 在那裏,我有三列:如何在ms sql中更改約束條件(如果其他位列爲真)

[IDReal] int identity (1,1), [IsReal] bit not null, [Code] nvarchar (20) null

現在我不知怎麼,當用戶改變[伊斯雷爾] 1,即我的專欄[編號]更改爲NOT NULL,獨特的,反之亦然。

我試圖像

CREATE TABLE [dbo].[sReal](
[IDReal] [int] IDENTITY(1,1) NOT NULL, 
[Code] [nvarchar](20) NULL, 
[IsReal] [bit] NOT NULL, 

ALTER TABLE [dbo].[sReal] ADD CONSTRAINT [DEF_IsReal] DEFAULT ((0)) FOR [IsReal] 
    GO 

ALTER TABLE [dbo].[sReal] ADD CONSTRAINT [CHNG_IsReal] IF [IsReal]=1 THEN (ALTER TABLE [dbo].[sReal] ALTER COLUMN [Code] [nvarchar](20) not null unique) 
ELSE END IF 
GO` 

這東西,當然,不工作,我不能使用觸發器或函數或過程來解決。

是否有任何其他解決方案來完成我想要做的事情。

回答

0

您不能動態地更改架構解決了這個問題。該模式適用於整個表。相反,我相信你應該添加以下內容:

  1. 過濾出的唯一索引,以確保代碼的唯一值,只有當伊斯雷爾的值爲1:

    CREATE UNIQUE INDEX ix_code ON dbo.sReal (Code) WHERE IsReal = 1

  2. 這是一種確保檢查約束代碼是從來沒有空當伊斯雷爾爲1

    ALTER TABLE dbo.sReal ADD CONSTRAINT cc_Code CHECK (IsReal = 0 OR Code IS NOT NULL)

0

這可能幫助你嘗試喝一次嘗試否則以另一種方式

IF EXISTS(

SELECT 1 From INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME='sReal' 
AND COLUMN_NAME='IsReal' AND DATA_TYPE='bit' 
) 
Begin 
DECLARE @Real BIT 
SELECT TOP [email protected]=[IsReal] From [sReal] WHERE [IsReal]=1 

IF (@Real=1) 
Begin 

ALTER TABLE [dbo].[sReal] ALTER COLUMN [Code] [nvarchar](20) NOT NULL 

ALTER TABLE [dbo].[sReal] ADD CONSTRAINT UC_Code UNIQUE ([Code]); 
END 
END 
0

一個簡單的方法可以是:

Declare @Variable1 int; 
SELECT @Variable1 = [IsReal] From [sReal] WHERE [IsReal]=1 --your user specific condition 

IF @Variable1 = 1 
BEGIN 
    alter table [sReal] ALTER COLUMN [Code][nvarchar](20) NOT NULL 
    alter table [sReal] ADD CONSTRAINT [CHNG_IsReal] UNIQUE([Code]) 
END 
ELSE 
IF @Variable1 <> 1 
BEGIN 
    alter table [sReal] DROP CONSTRAINT [CHNG_IsReal] 
    alter table [sReal] ALTER COLUMN [Code][nvarchar](20) NULL 
END