Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 自动为具有版本的数据设置状态字段_Sql Server - Fatal编程技术网

Sql server 自动为具有版本的数据设置状态字段

Sql server 自动为具有版本的数据设置状态字段,sql-server,Sql Server,我是SQL Server新手。我正在Azure中使用SQL Server,我正在寻找在输入新记录时完成状态字段设置的最佳方法 我有以下数据: 我需要设置\计算报价单状态字段 添加新版本时,新版本的Quote_状态应为打开状态 对于以前的版本或所有其他版本,Quote_状态应进行版本控制 新版本定义为Quote_系统、Quote_日期和Quote_ID均相等 添加新版本时,Quote_状态应如下所示: 我考虑过触发器和计算字段,但我从未做过类似的事情,也不知道如何启动SQL。谢谢 如果可以动态计

我是SQL Server新手。我正在Azure中使用SQL Server,我正在寻找在输入新记录时完成状态字段设置的最佳方法

我有以下数据:

我需要设置\计算报价单状态字段

添加新版本时,新版本的Quote_状态应为打开状态 对于以前的版本或所有其他版本,Quote_状态应进行版本控制 新版本定义为Quote_系统、Quote_日期和Quote_ID均相等

添加新版本时,Quote_状态应如下所示:


我考虑过触发器和计算字段,但我从未做过类似的事情,也不知道如何启动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
如果你真的需要一个触发器,我也可以想出类似的方法。但这是我最不喜欢的解决方案