Обновить поле функцией - PullRequest
       14

Обновить поле функцией

4 голосов
/ 15 декабря 2011

У меня есть функция, которая получает идентификатор и возвращает дату из таблицы, если она существует, или возвращает текущую дату, если ее нет:

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 не передается функции.

Ответы [ 2 ]

2 голосов
/ 15 декабря 2011

Ваши тесты (которые я пропустил при первом чтении, извините) достаточны, чтобы привести меня в замешательство.Похоже, что результаты вашего теста не должны быть возможными.

Мое единственное предложение - перекодировать функцию и посмотреть, что произойдет ...

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 голосов
/ 15 декабря 2011

Cross Apply - это то, что вы ищете, я думаю.

...