Sql-Server-2005

使用 CURSOR 從 SELECT 插入

  • September 3, 2015

我有一個看起來像這樣的表:

+====================================================+
| aid  |  uid  |  eid  |  name  |    dob     | paid  |
+====================================================+
|  1   |  100  |  10   |  Mick  | 1980-03-29 |  40   |
|  2   |  101  |  11   |  Jack  | 1969-11-21 |  40   |
|  3   |  205  |  11   |  Lynn  | 1990-07-10 |  80   |
|  4   |  217  |  10   |  Dana  | 1987-02-15 |  40   |
+----------------------------------------------------+

其中aid = 臨時表標識列,uid = 使用者表 FK,eid = 雇主表 FK

所以這個數據需要進入另一個表,但它看起來像這樣:

+====================================================+
|  id  |  uid  |  eid  |  week  |  postdate  | paid  |
+====================================================+
|  1   |  100  |  10   |    1   | 2015-09-03 |  10   |
|  2   |  100  |  10   |    2   | 2015-09-03 |  10   |
|  3   |  100  |  10   |    3   | 2015-09-03 |  10   |
|  4   |  100  |  10   |    4   | 2015-09-03 |  10   |
|  1   |  101  |  11   |    1   | 2015-09-03 |  10   |
|  2   |  101  |  11   |    2   | 2015-09-03 |  10   |
|  3   |  101  |  11   |    3   | 2015-09-03 |  10   |
|  4   |  101  |  11   |    4   | 2015-09-03 |  10   |
|  1   |  205  |  11   |    1   | 2015-09-03 |  20   |
|  2   |  205  |  11   |    2   | 2015-09-03 |  20   |
|  3   |  205  |  11   |    3   | 2015-09-03 |  20   |
|  4   |  205  |  11   |    4   | 2015-09-03 |  20   |
|  1   |  217  |  10   |    1   | 2015-09-03 |  10   |
|  2   |  217  |  10   |    2   | 2015-09-03 |  10   |
|  3   |  217  |  10   |    3   | 2015-09-03 |  10   |
|  4   |  217  |  10   |    4   | 2015-09-03 |  10   |
+----------------------------------------------------+

所以發生的事情是,我選擇一年中的一個月,然後我得到那個月的周數(week列),對於我的初始表中的每條記錄,我將一個添加到我的第二個表中。Mick、Jack 和 Dana 支付了 40(拆分 4

$$ weeks of the month $$),Lynn 支付了 80 美元,因此所選月份每週支付 20 美元。 所以基本上我想問一下使用 a 的**THISTHIS**類型的方法CURSOR是否是我正在尋找的,或者是否有更具體的方法來SELECT為表中的每條記錄插入記錄(不超過 600(x4)條記錄時間)。


附帶說明一下,這些範例僅考慮將記錄從一個表“移動”或複製到另一個表,因此這裡的 100 條記錄變成那裡的 100 條記錄。我可以使用 SQL 實現哪些選項來在我的臨時表(前端程式碼上的循環除外)上每條插入 4 條記錄?

下面是一個使用遞歸 CTE 創建每週值和一個簡單的 INSERT…SELECT 來填充您的表的範例。除了 postdate 是目前日期之外,為了測試,我假設了一些身份 ID。您不需要游標來完成這項工作。享受!

   --CREATE SCENARIO TEMP TABLE
   IF OBJECT_ID('tempdb..#TempUserPaid','U') IS NOT NULL
       DROP TABLE #TempUserPaid

   CREATE TABLE #TempUserPaid
   (
         aid INT IDENTITY
       , uid INT
       , eid INT
       , name VARCHAR(50)
       , dob DATE
       , paid DECIMAL(19,4)
   )

   INSERT #TempUserPaid
   VALUES
        (100,10,'Mick','1980-03-29',40.00)
       ,(101,11,'Jack','1969-11-21',40.00)
       ,(205,11,'Lynn','1990-07-10',80.00)
       ,(217,10,'Dana','1987-02-15',40.00)


   --CREATE WEEKLYPAYMENTS TABLE IF IT DOESN'T EXIST TO MODEL USER TABLE
   --DROP TABLE WeeklyPayments  --> CLEAR OUT FOR TESTING PURPOSES
   IF OBJECT_ID('WeeklyPayments','U') IS NULL
       CREATE TABLE WeeklyPayments
       (
             id INT IDENTITY
           , uid INT
           , eid INT
           , [week] INT
           , postdate DATE
           , paid DECIMAL(19,4)
       );

   --INSERT YOUR CODE TO GENERATE NUMBER OF WEEKS HERE TO SET @weeksInMonth
   --HARDCODING FOR THIS EXAMPLE
   DECLARE @weeksInMonth SMALLINT;
   SET @weeksInMonth = 4;


   --RECURSIVE CTE TO GENERATE THE NUMBER OF WEEKS
   WITH cteWeeks AS
   (
       SELECT 1 WeekInMonth
       UNION ALL
       SELECT WeekInMonth+1 
       FROM cteWeeks
       WHERE WeekInMonth < @weeksInMonth
   )
   INSERT WeeklyPayments
   SELECT t.uid, t.eid, c.WeekInMonth, CONVERT(DATE,GETDATE()), CAST(t.paid/4 AS money)
   FROM #TempUserPaid t, cteWeeks c
   ORDER BY t.uid;

   SELECT * FROM WeeklyPayments;

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