2011-12-15 3 views
4

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

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

Смежные вопросы