我需要为成批的行分配一个通用的 GUID id(供外部进程使用)。
下面是一个简化的设置,描述了我正在寻找的内容:
BASE_TABLE
表示此方案中的一个预先存在的表,显然已大大简化。“真实”表中的值应该被认为是随机的;它们在现实生活中不是连续的(即使 ID 也不是真正的 int)
CREATE TABLE BASE_TABLE (
ID int
,VALUE1 varchar(10)
,VALUE2 varchar(255)
)
TARGET_TABLE
uniqueIdentifier
代表我正在处理的过程的“输出”,它只是需要批量数据为每个批次都有一个 BATCHID 的其他东西的输入。现实生活中的批次约为 1000 行。
CREATE TABLE TARGET_TABLE
(
ID int
,VALUE1 varchar(10)
,VALUE2 varchar(255)
,BATCHID uniqueIdentifier
)
(添加一些虚拟数据)
DECLARE @DATA1 int
set @DATA1=0
WHILE @DATA1<100
BEGIN
INSERT INTO BASE_TABLE (ID,VALUE1,VALUE2) VALUES (@DATA1,'v1'+CONVERT(varchar,@DATA1), 'v2'+CONVERT(varchar,@DATA1))
SET @DATA1=@DATA1+1
END
/** 示例 DESIRED RESULT,批量大小为 5
ID | 价值1 | 价值2 | 批处理ID |
---|---|---|---|
0 | v10 | v20 | 38B1B4FB-7F1E-44FD-9336-19095C01C629 |
1 | v11 | v21 | 38B1B4FB-7F1E-44FD-9336-19095C01C629 |
2 | v12 | v22 | 38B1B4FB-7F1E-44FD-9336-19095C01C629 |
3 | v13 | v23 | 38B1B4FB-7F1E-44FD-9336-19095C01C629 |
4 | v14 | v24 | 38B1B4FB-7F1E-44FD-9336-19095C01C629 |
5 | v15 | v25 | 41122454-A743-4545-8F0C-D7B461E072AE |
6 | v16 | v26 | 41122454-A743-4545-8F0C-D7B461E072AE |
7 | v17 | v27 | 41122454-A743-4545-8F0C-D7B461E072AE |
8 | v18 | v28 | 41122454-A743-4545-8F0C-D7B461E072AE |
9 | v19 | v29 | 41122454-A743-4545-8F0C-D7B461E072AE |
10 | v110 | v210 | 41122454-A743-4545-8F0C-D7B461E072AE |
11 | v111 | v211 | FBDE5513-C869-4F2D-AC4D-40CBEF4A2D48 |
ETC
重要的结果是,对于每个大小为 N 的批次,有 N 行具有相同的 BatchID,它必须是一个 GUID。
我很确定我可以用光标做我想做的事,但如果可能的话,我想做这样的事情:
select
ID,VALUE1,VALUE2,
NEWID() OVER(PARTITION BY ROW_NUMBER() OVER (ORDER BY ID)) AS BatchID
from BASE_TABLE
但它无效,因为 NEWID() 不是聚合函数。