2011-12-15 6 views
4

でない場合、私はIDを取得し、それが存在するか、現在の日付を返す場合、テーブルから日付を返す関数を持っている:Updateフィールド

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

ありがとう、しかし、私はより良い解決策を見つける - 関数を削除し、1つのUPDATEクエリを作成します。 – demas

0

クロスアプライは私が思っているものです。

+0

Sqlは行単位ではなく、この操作を行います –

+0

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

+0

CROSS APLLYが関数テーブルを返しますが、私の関数はスカラー値を返します – demas

関連する問題