我正在执行SSIS进程,该进程将数据加载到表中,并使用execute SQL语句作为执行的最后一个组件,根据内容列的值更新标记值。一个例子是
update [payments].[MTFileValidationData_UAT]
set TAG = 'Header'
where left(content,3) = '{1:' and [TransactionId] = ?
这实际上是为一系列不同的标签所做的。一旦完成,就有一个名为FileSequenceNumber
的列,需要为每个标记更新一个编号,这样我最终可以将UAT和生产文件进行比较,以便进行测试。
我还需要更新列FileSequenceNumber
,为每个文件名提供每个标记的顺序编号。
预期结果:
RowID | TransactionId | FileName | FileType | Tag | Content | Location | FileSequenceNumber |
------+---------------+----------+----------+-----+---------+----------+--------------------+
1 9052312 ABCFile NULL Header XXX October 1
2 9052312 ABCFile NULL Header ZZZ October 2
3 9052312 ABCFile NULL Header YYY October 3
3 9052312 ABCFile NULL 32B YYY October 1
3 9052312 ABCFile NULL 32B YYY October 2
3 9052312 ABCFile NULL 32B YYY October 3
发布于 2020-04-27 07:59:39
我相信您希望使用Server 2012+提供的出色的窗口功能。具体来说,数
UPDATE
T
SET
FileSequenceNumber = ROW_NUMBER() OVER (PARTITION BY T.Tag ORDER BY RowID)
FROM
dbo.myTable AS T;
每次标签更改时,partition by
都会重置计数器。
order by
指定如何在标记列中生成序列。
正如注释中所指出的,窗口函数只能出现在select或oder by子句中,因此我们必须进行修改以满足标准。用于工作复制的DBFiddle 2019&fiddle=d731c14c9e15d70eb3b1d34f7b0f61a8
UPDATE
T
SET
T.FileSequenceNumber = TI.FileSequenceNumber
FROM
dbo.SO_61461648 AS T
INNER JOIN
(
SELECT
FileSequenceNumber = ROW_NUMBER() OVER (PARTITION BY TI.Tag ORDER BY TI.RowID)
, TI.RowID
FROM
dbo.SO_61461648 AS TI
) aS TI
ON TI.RowID = T.RowID;
如果所提供的数据是准确的,并且有4行具有相同的RowID,那么您将需要采用一种繁重的方法并转储表并重新加载它。
-- Heavy handed approach to dump the table and reload with new value in case RowID is not unique
declare @Intermediary table
(
RowID int NOT NULL
, Tag varchar(30) NOT NULL
);
DELETE T
OUTPUT DELETED.RowID, DELETED.Tag
INTO @intermediary(RowID, Tag)
FROM
dbo.SO_61461648 AS T;
INSERT INTO
dbo.SO_61461648
SELECT
D.*
, ROW_NUMBER() OVER (PARTITION BY D.Tag ORDER BY D.RowID)
FROM @Intermediary AS D;
SELECT * FROM dbo.SO_61461648 AS T order by RowID, FileSequenceNumber;
https://stackoverflow.com/questions/61461648
复制