Sql server 自动为具有版本的数据设置状态字段
我是SQL Server新手。我正在Azure中使用SQL Server,我正在寻找在输入新记录时完成状态字段设置的最佳方法 我有以下数据: 我需要设置\计算报价单状态字段 添加新版本时,新版本的Quote_状态应为打开状态 对于以前的版本或所有其他版本,Quote_状态应进行版本控制 新版本定义为Quote_系统、Quote_日期和Quote_ID均相等 添加新版本时,Quote_状态应如下所示:Sql server 自动为具有版本的数据设置状态字段,sql-server,Sql Server,我是SQL Server新手。我正在Azure中使用SQL Server,我正在寻找在输入新记录时完成状态字段设置的最佳方法 我有以下数据: 我需要设置\计算报价单状态字段 添加新版本时,新版本的Quote_状态应为打开状态 对于以前的版本或所有其他版本,Quote_状态应进行版本控制 新版本定义为Quote_系统、Quote_日期和Quote_ID均相等 添加新版本时,Quote_状态应如下所示: 我考虑过触发器和计算字段,但我从未做过类似的事情,也不知道如何启动SQL。谢谢 如果可以动态计
我考虑过触发器和计算字段,但我从未做过类似的事情,也不知道如何启动SQL。谢谢 如果可以动态计算柱,则可以使用以下方法:
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_系统、Quote_日期、Quote_ID的每一组,我将按降序枚举版本。这样,第一个即rn=1是开放的,而其余的是版本化的。在实际使用中,我会将where子句添加到实际的select中,这样就有一个合理的机会让它运行良好
如果您需要将其持久化,并且Quote_版本是单调递增的,我更喜欢在存储过程中执行。像这样:
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
如果你真的需要一个触发器,我也可以想出类似的方法。但这是我最不喜欢的解决方案