我使用的是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;
答案 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