2014-11-21 18 views
0

懂得兩百個招,每天,每個對應於比主子文件中的一個百招,總共一年是730萬筆信息 這裏是我的SQL命令如何紅眼與代碼SQLSERVER while循環

DECLARE @day INT =0 
DECLARE @everyday DATETIME 
DECLARE @mastercount INT=0 
DECLARE @detailcount INT=0 
DECLARE @state NVARCHAR(3)='ship' 
DECLARE @user VARCHAR(8)='Sid' 
DECLARE @masterid INT 

SET nocount ON 

WHILE(@day <= 364) 
    BEGIN 
     IF(@day = 122) 
     BEGIN 
      SET @user='danny' 
      SET @state='stock' 
     END 
     ELSE IF(@day = 244) 
     BEGIN 
      SET @user='annie' 
      SET @state='ship' 
     END 

     SET @everyday=Dateadd(yy, Datediff(yy, 0, Getdate()), @day) 

     WHILE(@mastercount < 200) 
     BEGIN 
      INSERT INTO OrderMaster 
         (OrderCustomerName,orderdate,orderstate) 
      VALUES  (@user,@everyday,@state) 

      SELECT @masterid = C_Id 
      FROM OrderMaster 
      WHERE C_Id = Scope_identity() 

      WHILE(@detailcount < 100) 
       BEGIN 
        INSERT INTO OrderDetail 
           (C_OrderMasterId,C_ProductMasterId,Quantity) 
        VALUES  (@masterid,1 + (21 - 1) * Rand(),Rand() * 100 + 1) 

        SET @[email protected] + 1 
       END 

      SET @detailcount=0-- 
      SET @[email protected] + 1 
     END 

     SET @mastercount=0 
     SET @[email protected] + 1 
    END 

SET nocount OFF 

但是 總共花費51分鐘 太長了~~ 我該如何縮短時間? 謝謝〜!

+0

您可以使用數字表來替換WHILE循環和有效的基於集合的操作。查看第一個回答http://dba.stackexchange.com/questions/11506/why-are-numbers-tables-invaluable – hatchet 2014-11-21 01:52:43

+0

感謝您的回覆,我正在使用谷歌搜索相關信息:) – SID 2014-11-21 02:04:06

回答

0

試試這個。使用Recursive CTE生成的記錄將避免row by row插入您的while loop

DECLARE @day INT =0 
DECLARE @everyday DATETIME 
DECLARE @mastercount INT=0 
DECLARE @detailcount INT=0 
DECLARE @state NVARCHAR(3)='ship' 
DECLARE @user VARCHAR(8)='Sid' 
DECLARE @masterid INT 

SET nocount ON 

WHILE(@day <= 364) 
    BEGIN 
     IF(@day = 122) 
     BEGIN 
      SET @user='danny' 
      SET @state='stock' 
     END 
     ELSE IF(@day = 244) 
     BEGIN 
      SET @user='annie' 
      SET @state='ship' 
     END 

     SET @everyday=Dateadd(yy, Datediff(yy, 0, Getdate()), @day); 

     WITH cte 
      AS (SELECT 1 id,@user [user],@everyday everyday,@state [state] 
       UNION ALL 
       SELECT id + 1,[user],everyday,[state] 
       FROM cte 
       WHERE id < 200) 
     INSERT INTO OrderMaster 
        (OrderCustomerName,orderdate,orderstate) 
     SELECT [user],everyday,[state] 
     FROM cte 
     OPTION (maxrecursion 0) 

     SELECT @masterid = C_Id 
     FROM OrderMaster 
     WHERE C_Id = Scope_identity(); 

     WITH cte 
      AS (SELECT 1 id, @masterid masterid, 
         ((21 - 1) * Checksum(LEFT(Newid(), 1)))/100 C_ProductMasterId, 
         (Checksum(LEFT(Newid(), 1)) * 100 + 1)/100 Quantity 
       UNION ALL 
       SELECT id + 1, masterid, 
         ((21 - 1) * Checksum(LEFT(Newid(), 1)))/100 C_ProductMasterId, 
         (Checksum(LEFT(Newid(), 1)) * 100 + 1)/100 Quantity 
       FROM cte 
       WHERE id < 100 * 200) 
     INSERT INTO OrderDetail 
        (C_OrderMasterId,C_ProductMasterId,Quantity) 
     SELECT masterid, 
      C_ProductMasterId, 
      Quantity 
     FROM cte 
     OPTION (maxrecursion 0) 

     SET @[email protected] + 1 
    END 


    SET nocount OFF 
+0

看起來不錯,但似乎超過了我目前的學歷,我會努力去理解,謝謝 – SID 2014-11-21 02:37:24

+0

看來應該是我的問題出錯了,應該是 365day * 200master * 100detail now MasterTable Data is correct DetailTable Date is Incorrect https ://drive.google.com/file/d/0BxbWqkwkGqNaVDh1NTBRRHl2c3M/view – SID 2014-11-21 04:04:48

+0

@SID我們沒有詳細信息表中的日期 – 2014-11-21 04:22:45