2013-04-09 92 views
0

我在循環中遇到了SQL問題。 我想循環一個startdate直到他到達enddate。在不使用遊標的情況下在SQL中循環插入語句

他們對我說,不要使用遊標,讓我發現了這樣一個例子:

with mycte as 
(
select cast('2007-01-01' as datetime) DateValue 
union all 
select DateValue + 1 
from mycte 
where DateValue + 1 < '2030-12-31' 
) 
select * from mcte 

這個工作,所以我改變的變量我的情況:

with View_Solidnet_Training as 
(
select StartingDate as DateValue 
union all 
insert into OBJ_Availability values(34, DateValue + 1, 'AM', 2, 'Test') 
select DateValue + 1 
from View_Solidnet_Training 
where DateValue + 1 < EndingDate 
) 
select * from View_Solidnet_Training 

但我出現以下錯誤:

Msg 156, Level 15, State 1, Line 5 Incorrect syntax near the keyword 'insert'. Msg 128, Level 15, State 1, Line 5 The name "DateValue" is not permitted in this context. Valid expressions are constants, constant expressions, and (in some contexts) variables. Column names are not permitted. Msg 102, Level 15, State 1, Line 9 Incorrect syntax near ')

+0

你得到的錯誤是什麼? – 2013-04-09 07:10:36

+0

消息156,級別15,狀態1,行5 關鍵字'插入'附近的語法不正確。 Msg 128,Level 15,State 1,Line 5 在此上下文中不允許使用名稱「DateValue」。有效表達式是常量,常量表達式和(在某些情況下)變量。列名不被允許。 Msg 102,Level 15,State 1,Line 9 ')'附近的語法不正確。 – user2206834 2013-04-09 07:13:46

+1

請不要將重要信息作爲評論發佈。編輯您的問題 – 2013-04-09 07:14:49

回答

0

請嘗試:

with View_Solidnet_Training as 
(
    select @StartingDate as DateValue 

    union all 

    select DateValue + 1 
    from View_Solidnet_Training 
    where DateValue + 1 < @EndingDate 
) 
insert into OBJ_Availability 
select 34, DateValue + 1, 'AM', 2, 'Test' from View_Solidnet_Training 

提供@StartingDate@EndingDate有兩個日期時間變量ADN表OBJ_Availability應該包含在CTE的選擇順序只有5列。

+0

看起來不錯,但錯誤:消息156,級別15,狀態1,行11 關鍵字'選擇'附近的語法不正確。 – user2206834 2013-04-09 07:19:09

+0

'StartingDate'應該是一個像'@StartDate'這樣的變量,併爲其設置一個最小日期值。 – TechDo 2013-04-09 07:29:46

+0

無法回答我自己的問題。 鏈接:http://stackoverflow.com/questions/15896138/looping-sql-statement-insert – user2206834 2013-04-09 07:44:29

0

試試這個(未經測試):

with mycte as 
(
    select 34, cast('2007-01-01' as datetime) DateValue, 'AM', 2, 'Test' 
    union all 
    select 34, DateValue + 1, 'AM', 2, 'Test' 
    from mycte 
    where DateValue + 1 < '2030-12-31' 
) 
insert into OBJ_Availability (select * from mcte) 
相關問題