Sql-Server-2005
使用 CURSOR 從 SELECT 插入
我有一個看起來像這樣的表:
+====================================================+ | 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 的**THIS或THIS**類型的方法
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;