如何在sql server中使用每个循环?

Ram*_*ngh 1 sql sql-server foreach

我有一个tblEmpDetail包含列的表CreatedDate.

我想为每个创建的日期添加72小时,所以如果创建的日期是,2012-07-14 07:21:19.180那么我想要输出2012-07-17 07:21:19.180.

有人能让我知道我怎么能达到这个目的?

其实我想要做的就是去每行然后检查一下

getdate() - createddate 
Run Code Online (Sandbox Code Playgroud)

等于或小于72小时; 然后我需要增加72小时createddate.否则我希望该列为null.我把我的代码粘贴到了我所做的事情上.

Declare @PassedTime datetime
set @PassedTime= DATEDIFF(HH,Createddate, GETDATE())

if CONVERT(varchar(20),@PassedTime,108)>=CONVERT(varchar(20),'72:00:00',108)
begin
    select empno,empName,CreatedDate,dateadd(HH,72,CreatedDate)BD from tblEmpDetail 
end
else
begin
   select empno,empName,CreatedDate,'' as BD from tblEmpDetail
end
Run Code Online (Sandbox Code Playgroud)

Joh*_*zen 5

不需要循环.

SQL Server擅长做"基于集合"的查询.

要获得投射:

select
    CreatedDate,
    DateAdd(hour, 72, CreatedDate) [NewDate]
from
    tblEmpDetail
Run Code Online (Sandbox Code Playgroud)

要永久更新表格:

update
    tblEmpDetail
set
    CreatedDate = DateAdd(hour, 72, CreatedDate)
Run Code Online (Sandbox Code Playgroud)

如果你必须有一个循环,你可以使用一个游标:

declare cur cursor fast_forward read_only for
select
    CreatedDate,
    DateAdd(hour, 72, CreatedDate) [NewDate]
from
    tblEmpDetail

-- here, you would use the cursor.
Run Code Online (Sandbox Code Playgroud)

有关游标的更多信息,请访问:http://msdn.microsoft.com/en-us/library/ms180169.aspx

编辑

您的上述查询可以基于集合的方式完成,如下所示:

select
    CreatedDate,
    CASE
        WHEN DateAdd(hour, 72, CreatedDate) <= GetDate() THEN NULL
        ELSE DateAdd(hour, 72, CreatedDate)
    END [NewDate]
from
    tblEmpDetail
Run Code Online (Sandbox Code Playgroud)