在一个表中插入大量数据(5k行)到另一个表,在SQL Server中对行进行洗牌

时间:2015-08-01 05:39:56

标签: sql-server sql-insert

我使用的是SQL Sserver 2008。

从一个表向另一个表插入大量数据(大约5k行)时,会对行进行洗牌。这种情况只发生过几次,并非总是如此。我还使用Order by子句对行进行排序。

这可能吗?

查询显示在此处:

INSERT INTO R_G_23 (Sr_No, Date, Item_Code, Item_Name, Received_Qty, Invoice_No, Invoice_Date, Supplier_ECC_No, Supplier_Name, Supplier_Address, Range_and_Division, Issued_Challan_No, Issued_Date, Issued_Qty, Ar_In_No_Date, Qty,Doc_Part, Otherwise_Qty, Balance_Qty, Excise_Officer_Initial, GRN_No)
   SELECT 
       Sr_No, Date, Item_Code, Item_Name, Received_Qty, Invoice_No, Invoice_Date, Supplier_ECC_No, Supplier_Name, Supplier_Address, Range_and_Division, Issued_Challan_No, Issued_Date, Issued_Qty, Ar_In_No_Date, Qty,Doc_Part, Otherwise_Qty, Balance_Qty, Excise_Officer_Initial, GRN_No
   FROM 
       Temp_R_G_23 
   ORDER BY 
       Sr_No asc;

1 个答案:

答案 0 :(得分:0)

解决方案1:

执行 INSERT INTO Target_Table SELECT FROM source_table ORDER BY COL1 不考虑order by子句,因为在内部查询中不允许order by。 因此,在您的查询中,即使您按列指定顺序,也不会考虑它。将执行除了order by之外的部分查询。 尝试将select查询放在括号中,它会给出一个错误,即子查询中不允许ORDER BY。

如果表的列上有任何聚簇索引,并且您在此类表上批量插入,则数据将按聚簇索引列的升序插入。

因此,如果您在 R_G_23 表的 Sr_No 列上有任何聚类索引,则数据将按 Sr_no 列的升序插入 R_G_23 表。即使你指定任何order by子句也没用。

您可以尝试的是在要对表 Temp_R_G_23 R_G_23 中的数据进行排序的列上应用聚簇索引,然后执行查询。

在目标表上应用聚簇索引后,无论您在表中插入什么数据,它都将按索引键排序。

解决方案2:

如果您不想创建任何索引而不是您可以做的 首先使用下面给出的样本查询将数据从源表插入临时表,以便对数据进行排序。

SELECT * INTO TEMP#

FROM(

选择[NO] = ROW_NUMBER()OVER(ORDER BY t1.Sr_No asc),Sr_No,Date,Item_Code,Item_Name,Received_Qty,Invoice_No  来自Temp_R_G_23 t1

)AS X

通过指定列名

,从TEMP#表向目标表插入数据之后

INSERT INTO R_G_23(Sr_No,Date,Item_Code,Item_Name,Received_Qty,Invoice_No

从TEMP#中选择Sr_No,Date,Item_Code,Item_Name,Received_Qty,Invoice_No