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 パラメータが関数に渡されていないようです。

4

2 に答える 2

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
于 2011-12-15T09:08:50.897 に答える
0

Cross Applyはあなたが探しているものだと思います。

于 2011-12-15T08:36:55.387 に答える