Sql-Server
每 X 行創建一個表
我有一個 SQL 表,我們正在出售一些數據,所以我需要一種快速的方法,將主表拆分為每 50 行的子表。表命名無關緊要,我只是堅持為每個表選擇 50 個不同的行,而該表不包含主鍵或數字欄位。
在 SQL Server 2008 中如何解決這個問題?
既然你說你可以改變原來的表:
- 更改原始表,添加新列
batch_id
(預設為 NULL)。- 執行以下
DECLARE @rowCount int = 1 ,@batchId int = 1 ; WHILE @rowCount > 0 BEGIN UPDATE TOP (50) myTable SET batch_id = @batchId WHERE batch_id IS NULL ; SELECT @rowCount = @@ROWCOUNT ,@batch_id = @batch_id + 1 ; END;
- 然後,只需創建新表
myTable_batch_x
,其中x為 1 到@batchId - 1
,並根據儲存的批次 ID 分配記錄。如果您無法修改原始表,但有空間製作它的副本,請使用新列創建一個副本,然後按照上述步驟進行操作。
或者:將
my_row_id
列(整數)添加到原始表中,作為IDENTITY
列:ALTER TABLE myTable ADD COLUMN my_row_id int IDENTITY(1,1) NOT NULL;
這將創建新列,並使用從 1 開始的連續整數自動填充它。
使用新值,將行分配給批次(1-50、51-100 等)。要獲取進入給定批次的行:
SELECT * -- or, actual column list - you can exclude my_row_id that way FROM myTable WHERE (((my_row_id - 1) / 50) + 1) = @batch_no ;
因為
my_row_id
是一個整數,如果我們將它除以另一個整數,任何小數結果都將被丟棄。所以,0/50
= 0, …,49/50
= 0,50/50
= 1, …。要my_row_id
在第 1 批中包含 = 50,我們只需從 中減去 1my_row_id
。而且,從batch_no
1 而不是 0 開始,我們加一來得到我們的batch_no
.注意:如註釋中所述,您可以稍微簡化程式碼。如果
IDENTITY(50,0)
在添加時使用my_row_id
,則 WHERE 子句可能是:WHERE (my_row_id / 50) = @batch_no
前 50 行編號為 50-99,這個等式將為
1
它們求值;對於接下來的 50 行 (100-149),它的計算結果為2
; 等等。