2011-12-15 6 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

답변

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

고마워,하지만 더 나은 해결책을 찾았습니다. 함수를 제거하고 하나의 UPDATE 쿼리를 만듭니다. – demas

0

크로스 적용이 내가 생각하는 것입니다.

+0

Sql은 행 단위가 아닌이 작업을 설정합니다 –

+0

http://www.sqlteam.com/article/using-cross-apply-in-sql-server-2005 –

+0

CROSS APLLY가 함수와 함께 작동하는 것을 볼 수 있습니다 테이블을 반환하지만 내 함수는 스칼라 값을 반환합니다. – demas