更新 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 应该每天重置”时,您是指挂钟时间的每一天,还是表中其他date
或 datetime
列的每一天?
挂钟时间的每一天,对于每个新的一天,每个请求类型的 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 表以通过存储过程执行此操作的主要内容,如果未能解决你的问题,请参考以下文章