Sql-Server

每 X 行創建一個表

  • November 9, 2017

我有一個 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,我們只需從 中減去 1 my_row_id。而且,從batch_no1 而不是 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; 等等。

引用自:https://dba.stackexchange.com/questions/190558