2011-12-15 64 views
4

我有获取ID,如果它存在或返回当前的日期从表返回日期的功能,如果不是:更新场

CREATE FUNCTION [dbo].[CLOSEDATE] (@ID int) 
RETURNS datetime 
AS 
    BEGIN 
    DECLARE @closed int; 
    DECLARE @result datetime; 

    SELECT @result = created_on from dbo.statuses_history 
      WHERE journalized_id = @ID and new_status = 'Закрыто'; 

    IF @result IS NULL  
     SELECT @result = GETDATE()  

    RETURN (DATEADD(dd, 0, DATEDIFF(dd, 0, @result))) 
    END; 

下一个查询从表中返回正确的日期:

select dbo.closedate(4170) 
select dbo.closedate(id) from issues where id = 4170 

而接下来的代码更新记录正确的(从表中的值):

DECLARE @d AS datetime 
select @d = dbo.closedate(4170) 
UPDATE issues SET created_on = @d WHERE issues.id = 4170 

,但我得到当前的日期在现场如果我更新记录:

UPDATE issues 
SET created_on = dbo.CloseDate(id) 
WHERE issues.id = 4170 

它看起来像ID参数不传递给函数。

+0

是的,我都试过了。没关系 – demas 2011-12-15 08:36:10

回答

2

你的测试(我错过了一读,抱歉)足以让我非常困惑。看来你的测试结果应该是不可能的。

我唯一的建议是要重新编码的功能,看看会发生什么......

CREATE FUNCTION [dbo].[CLOSEDATE] (@ID int) 
RETURNS TABLE 
AS 
RETURN 
    SELECT 
    (DATEADD(dd, 0, DATEDIFF(dd, 0, ISNULL(MAX(created_on), GetDate())))) AS close_date 
    FROM 
    dbo.statuses_history 
    WHERE 
    journalized_id = @ID 
    AND new_status = 'Закрыто' 

然后......

UPDATE 
    issues 
SET 
    created_on = fn.close_date 
FROM 
    issues 
CROSS APPLY 
    dbo.CLOSEDATE(id) AS fn 
WHERE 
    issues.id = 4170 
0

交叉应用是你在寻找的我认为。

+0

Sql是否这个操作集不是基于行 – 2011-12-15 08:37:27

+0

http://www.sqlteam.com/article/using-cross-apply-in-sql-server-2005 – 2011-12-15 08:38:24