2016-11-09 84 views
1

我想知道是否可以在表中創建列,並根據同一表中另一列的值自動獲取它們的值,例如以下澄清:使列基於另一列的值接收0或1

CREATE TABLE dbo.example 
(
    m_id INT NOT NULL CONSTRAINT PK_mid PRIMARY KEY IDENTITY (1,1), 
    m_name NVARCHAR(30) NOT NULL, 
    m_startdate DATE NOT NULL CONSTRAINT CHK_startdate CHECK(m_startdate <= SYSDATETIME()), 
    m_enddate DATE CONSTRAINT CHK_enddate CHECK(m_enddate <= SYSDATETIME()), 
    m_status INT CONSTRAINT CHK_status CHECK(m_status = 0 or m_status = 1) 
) 

我要讓m_status接受0,如果m_enddate爲null 1,如果它不爲空。這當然會在插入一行。

+0

據我所知 - 你不能這樣做。你可以做的是觸發器。 – sagi

+0

請參考這一個[鏈接](http://stackoverflow.com/questions/3438066/check-constraint-on-multiple-columns) – Husen

+0

的確,唯一的方法是通過一個觸發器(順便說一下,不僅在INSERT但也在更新)。 – FDavidov

回答

5

如下你可以使用一個計算列...

CREATE TABLE dbo.example 
(
m_id INT NOT NULL CONSTRAINT PK_mid PRIMARY KEY IDENTITY (1,1), 
m_name NVARCHAR(30) NOT NULL, 
m_startdate DATE NOT NULL CONSTRAINT CHK_startdate CHECK(m_startdate <= SYSDATETIME()), 
m_enddate DATE CONSTRAINT CHK_enddate CHECK(m_enddate <= SYSDATETIME()), 
m_status AS CASE 
    WHEN m_enddate is null THEN 0 ELSE 1 
    END 
) 
2

計算列邁克爾建議是最好的,但如果你不能改變的表,那麼你可以彌補這方面的視圖。現在

CREATE VIEW dbo.vwExample AS 
    SELECT m_id, 
     m_name, 
     m_startdate, 
     m_enddate, 
     CASE WHEN m_enddate is null THEN 0 ELSE 1 END as m_status 
    FROM dbo.example 

你可以做

select * from dbo.vwExample 

,這將有m_status正確的值,而不必更改表本身。

1

在T-SQL中,您可以使用替代插入/更新觸發器,它允許您攔截插入和更新並注入邏輯。

CREATE TRIGGER dbo.exampleInsertTrigger 
    ON [dbo].[example] 
    INSTEAD OF INSERT 
AS 
BEGIN 
INSERT INTO [dbo].[example] 
    ([m_name] 
    ,[m_startdate] 
    ,[m_enddate] 
    ,[m_status]) 
SELECT 
    [m_name] 
    ,[m_startdate] 
    ,[m_enddate] 
    ,CASE 
    WHEN [m_enddate] is null THEN 0 ELSE 1 
    END 
FROM inserted 
END 


CREATE TRIGGER dbo.exampleUpdateTrigger 
    ON dbo.example 
    INSTEAD OF UPDATE 
AS 
BEGIN 
UPDATE [dbo].[example] 
    SET 
    [m_name] = inserted.[m_name] 
    ,[m_startdate] = inserted.[m_startdate] 
    ,[m_enddate] = inserted.[m_enddate] 
    ,[m_status] = CASE 
    WHEN inserted.[m_enddate] is null THEN 0 ELSE 1 
    END 
FROM inserted 
WHERE inserted.[m_id] = [dbo].[example].[m_id] 
END