2017-07-18 113 views
0

我是SQL Server的新手。我在Azure中使用SQL Server,並且正在尋找在輸入新記錄時完成設置狀態字段的最佳方法。自動爲具有版本的數據設置狀態字段

,我有以下數據:

我需要設置\計算Quote_Status領域。

  1. 當增加新版本,新版本的Quote_Status應該是「開放」
  2. 對於以前的版本(或所有其他版本),Quote_Status應該是「版本化」

新版本被定義爲Quote_System,Quote_Date和Quote_ID都是平等的。

當增加新版本中,Quote_Status應該是這樣的:

我認爲觸發器和計算領域,但我從來沒有做過這樣的事,不知道如何下手SQL。謝謝!

回答

1

如果列可以實時計算,像下面這樣可以工作:

with cte as (
    select *, 
     row_number() over (
     partition by Quote_System, Quote_Date, Quote_ID 
     order by QuoteVersion desc 
    ) as rn 
    from dbo.yourTable 
) 
select *, case when rn = 1 then 'Open' else 'Versioned' end as Quote_Status 
from cte; 

實質上,(Quote_System,Quote_Date,Quote_ID),我列舉降序版本的每個分組訂購。因此,第一個(即rn = 1)是開放的,其餘的是版本化的。在實際使用中,我會在實際選擇中添加一個where子句,以便它有一個合理的表現。

如果你需要它被持久化並且Quote_Version是單調遞增的,我寧願在存儲過程中這樣做。像這樣:

create procedure dbo.insert_Quote (
    @Quote_System varchar(20), 
    @Quote_Date date, 
    @Quote_ID varchar(20), 
    @Quote_Version int 
) 
as 
begin 
    update dbo.yourTable 
    set Quote_Status = 'Versioned' 
    where Quote_System = @Quote_System 
     and Quote_Date = @Quote_Date 
     and Quote_ID = @Quote_ID 
     and Quote_Status <> 'Versioned'; 

    insert into dbo.yourTable 
     (Quote_System, Quote_Date, Quote_ID, Quote_Version, Quote_Status) 
    values 
     (@Quote_System, @Quote_Date, @Quote_ID, @Quote_Version, 'Open'); 
end 

如果你真的需要一個觸發器,我也可以想出類似的東西。但這是我最不喜歡的解決方案。

相關問題