更新 SQL Server 表以通过存储过程执行此操作

Posted

技术标签:

【中文标题】更新 SQL Server 表以通过存储过程执行此操作【英文标题】:Update SQL Server table to do this via a stored procedure 【发布时间】:2019-09-30 17:52:52 【问题描述】:

我需要使用基于SELECT 日期时间升序的自动生成序列以及基于类型的列来更新 SQL Server 列。

这是我想到的算法:

1. To update a column AppNo  
update column_of_interest 
from_above_table 
auto_increment value (1..n)
where 
following datetime_col desc
2a. If Requesttype is AAA for a select where 
following datetime_col desc then there should be a different (1...n)
update
2b. If Requesttype is BBB for a select where 
following datetime_col desc then there should be a different (1...n)
update
3. The AppNo should reset each day, for each Requestype too.

目前我感兴趣的列 (AppNo) 暂时为空。 我想像下面这样更新它:

ProjectID AppNo ProcessedDate
--------- ----- ----------------
       11     3 2019-09-30 18:21
        3     1 2019-09-25 08:37
        3     2 2019-09-25 08:37
       11     1 2019-09-25 08:39
       11     2 2019-09-25 08:40
        7     1 2019-09-26 14:19
        7     2 2019-09-26 14:20
        7     3 2019-09-26 14:22
        2     1 2019-09-26 14:23
       11     1 2019-09-26 14:23
       11     2 2019-09-26 14:24
       11     3 2019-09-26 14:24
        3     1 2019-09-26 14:24

我需要根据上述内容填充我感兴趣的列。

【问题讨论】:

您提到“计算列”,但您的代码看起来像是在更新真实列。它还有几个根本不是标准 SQL 的词。您确定您的 DBMS 是 Microsoft SQL Server 吗?如果是这样,并且您在查询中添加了一些描述性文本,您是否可以插入注释行以便更清楚您想要什么? 我说的是算法而不是sql server本身。我的想法是以算法的形式表达的,而不是真正的 sql server。 问题是你的问题一点都不清楚。您应该做的是发布现有表的创建语句。然后清楚地解释你想做什么。好像你想添加一个新列?但是这个新列的价值是什么? 我已经编辑了这个问题,我不知道它现在是否有意义 @PeterGodfreyObike 我已将屏幕截图链接中的数据作为文本转录到您的问题中。请避免包含数据图像 - 这会使人们更难复制您的数据以帮助您解决问题。 【参考方案1】:

问题不是很清楚,但我认为您正在寻找row_number() 函数,例如:

select
  foo,
  bar,
  baz,
  column_of_interest = row_number() over (order by datetime_col desc)
from above_table

这本身不是计算列,因为它不是表架构的一部分,但应该可以达到您想要的效果。

【讨论】:

你接近我想要的,但可能是因为问题没有很好地提出。请查看已编辑的问题。感激不尽 当您说“AppNo 应该每天重置”时,您是指挂钟时间的每一天,还是表中其他 datedatetime 列的每一天? 挂钟时间的每一天,对于每个新的一天,每个请求类型的 AppNo 应该从 (1....n) 重新开始 i.stack.imgur.com/DI0XM.png 这是 AppNo 更新的链接【参考方案2】:

每天早上,您都可以运行以下查询,以每天为每种请求类型更新前一天的所有记录,并使用适当的行号。

;WITH CTE_TableToUpdate
(
SELECT ColumntoUpdate, DateOfUpdate, RequestType
Row_Number() OVER(PARTITION BY RequestType, DateOfUpdate ORDER BY DateOfUpdate) AS rn
FROM TableToUpdate
WHERE ColumnToUpdate IS NULL
AND DateOfUpdate < CAST(GETDATE() AS DATE)
)
UPDATE CTE_TableToUpdate
SET ColumnToUpdate = rn

【讨论】:

非常感谢,虽然我还没有运行你的脚本。但是对于每个条目,我希望列值几乎可以立即使用。 它不起作用,我在更新前检查了 rn 列,我得到的只是所有行的 1、1、1。请我需要你再次检查你的答案

以上是关于更新 SQL Server 表以通过存储过程执行此操作的主要内容,如果未能解决你的问题,请参考以下文章

从 Sql Server 2008 执行 oracle 存储过程

SQL Server 触发器

SQL Server 触发器

SQL SERVER 触发器

SQL Server 数据库项目 - 创建更改脚本

SQL Server 触发器