2015-04-29 20 views
1

我有收到一个特定的日期作为参数 即Exec的ProcDB“20150428”SQL,如何循环使用作为参数的过程的日期列表?

我经常需要运行这个程序对许多日期和程序通常我重新输入Exec的ProcDB“日期1” GO Exec的ProcDB“ date2'go ..... 我认为这是不聪明,所以

我可以使用SELECT DISTINCT [日期]日期从表1排序[日期]的有效的列表。

所以我想创建一个接收Start_DtEND_DT 一个新的程序和它遍历所有日期,我选择不同的收益,其中包括Start_Dt和END_DT之间的。

ie something like: 

Create ProcDBlist Start_Dt as date, End_Dt as date 
For each date in: Select Distinct [date] from [table1] where [date] >= @Start_Dt and [date] <= @End_dt 
Do: Exec ProcDB 'Date n' 
End 

更新:

最终溶液:

Create procedure [dbo].[ProcessDBRange] (@Start_dt as varchar(15) =null, @End_dt as varchar(15) =null) 
As 
Begin 
DECLARE @date as varchar(15) 

DECLARE Cursor_ProcessDB CURSOR FOR 
    Select Distinct Convert(varchar(15), [date], 112) as [date] 
    From [Prices] 
    Where [date] >= @Start_dt and [date] <= @End_dt 
    Order By [date] 

OPEN Cursor_ProcessDB 

FETCH next FROM Cursor_ProcessDB 
INTO @date 

WHILE @@FETCH_STATUS = 0 

BEGIN 

Exec ProcessDB @date 

FETCH next FROM Cursor_ProcessDB 
INTO @date 

END 
CLOSE Cursor_ProcessDB 
DEALLOCATE Cursor_ProcessDB 
End 
+0

检查出答案[这里](http://stackoverflow.com/questions/477064/is-it-possible-to -execute-A-存储过程-过一集,而无需-使用-A-光标)。 – zimdanen

回答

1

这可以通过使用一个cursor.
基本上完成,它是这样的:

DECLARE @Date datetime -- a local variable to get the cursor's result 

DECLARE DatesCursor CURSOR FOR 
    Select Distinct [dates] where [dates] between @Start_Dt and @End_Dt From Table1 Order By [dates]. -- the query that the cursor iterate on 

OPEN DatesCursor 
FETCH NEXT FROM DatesCursor INTO @Date 
WHILE @@FETCH_STATUS = 0 -- this will be 0 as long as the cursor returns a result 
    BEGIN 
    Exec ProcDB @Date 
    FETCH NEXT FROM DatesCursor INTO @Date -- don't forget to fetch the next result inside the loop as well! 
    END 
-- cleanup - Very important! 
CLOSE DatesCursor 
DEALLOCATE DatesCursor 

编辑
我刚刚读了 zimdanen给你的评论,我必须说我认为在这种情况下,它可能比使用游标更好。

编辑#2

首先,更改OPEN subOPEN cursor_name。 其次,使用CONVERT以日期为字符串。 确保您使用正确的样式进行转换,否则您很容易得到不正确的日期和/或例外情况。

+0

嗨,谢谢。请将我关于程序问题的其他部分看作是对原始问题的更新。 – Flib

+0

看到我编辑的答案,编辑#2后的部分。 –

+0

子替换。并将@date重置为Date,但converto不能以这种方式工作:Exec ProcessDB Convert(varchar(15),@ date) – Flib

2

您将需要使用游标。我相信这是一个很好的资源:http://www.codeproject.com/Tips/277847/How-to-use-Cursor-in-Sql

我试着用你提供的信息做一个例子。

DECLARE @Start_dt DATE; 
DECLARE @End_dt DATE; 
DECLARE @date DATE; 

DECLARE cursor_name CURSOR FOR 
    SELECT DISTINCT Date 
    FROM [table1] 
    WHERE Date >= @Start__Dt 
     and Date <= @End__Dt 
    ORDER BY Date 

OPEN cursor_name 

FETCH next FROM cursor_name 
INTO @date 

WHILE @@FETCH_STATUS = 0 

BEGIN 

DECLARE @date2 VARCHAR(15) 
SET @date2 = (CAST (@date AS varchar(15))) 

Exec ProcdB date_parameter_name = @date2  

FETCH next FROM cursor_name 
INTO @date 

END 
CLOSE cursor_name 
DEALLOCATE cursor_name 
+0

嗨,谢谢。请将我关于程序问题的其他部分看作是对原始问题的更新。 – Flib

+0

如果我理解正确,你说的是你使用的sproc所接收的参数是一个varchar,并且你的Prices表中的[date]列是一个日期时间。 如果是这种情况,我建议在光标内放置转换函数,以将从Price表中拉出的数据类型从Date更改为varchar。 https://technet.microsoft.com/zh-cn/library/aa224021(v=sql.80).aspx CAST(@date AS VARCHAR(15)) –

+0

我更新了响应以显示演员的位置,我的游标名称也不一致(显示为打开的子文件),您需要用您的游标名称替换此名称以及在您的回复中 –

0

你可以用光标来做到这一点。你还可以改变PROC接收2个参数@sd date, @ed date然后在进程内做一个循环:

alter procedure procDB 
@sd date, 
@ed date 
as 
begin 
    while @sd <= @ed 
    begin 
     --do your staff 

     set @sd = dateadd(dd, 1, @sd) 
    end  
end