UDF не возвращает то же значение, что и select, содержащийся в UDF - PullRequest
1 голос
/ 16 марта 2012

Я создал этот UDF

CREATE FUNCTION [dbo].[HasExtendedRetentionSamples] (@BoxNumber varchar(20))
RETURNS  int

AS  

BEGIN 

      declare @cnt int
      set @cnt  = 0

      select @cnt =     (select count(*)
            from tFreezerBoxInfo bi
            inner join tFreezerDetails fd on fd.boxTrayId = bi.boxTrayId
            inner join tncDrugTestListNew dt on dt.labnumber = fd.labnumber
            inner join ExtendedRetentionSites a on dt.number = a.number
            where boxnumber = 'ND011811001'
            and 
            case isnull([retention],0)
                when 0 then proposedDestructionDate
                else dateadd(dd,abs([retention]),proposedDestructionDate)
            end  <> proposedDestructionDate)

      return @cnt

END

Когда я выполняю UDF

select dbo.[HasExtendedRetentionSamples] ('ND011811001')

Возвращено значение 0, что неверно,

Когда я выполняю инструкцию SQL, содержащуюся в UDF (заменяя @BoxNumber на ND011811001 ') ...

select count(*)
  from tFreezerBoxInfo bi
  inner join tFreezerDetails fd on fd.boxTrayId = bi.boxTrayId
  inner join tncDrugTestListNew dt on dt.labnumber = fd.labnumber
  inner join ExtendedRetentionSites a on dt.number = a.number
  where boxnumber = 'ND011811001'
  and 
  case isnull([retention],0)
        when 0 then proposedDestructionDate
        else dateadd(dd,abs([retention]),proposedDestructionDate)
  end  <> proposedDestructionDate

Возвращено значение 5, что является правильным.

Итак, большой вопрос: ПОЧЕМУ ????

Все типы данных в операторе соединений и регистров одинаковы.

Ответы [ 2 ]

0 голосов
/ 16 марта 2012

Мне стыдно сказать, я выяснил, почему это происходит .....

Когда я создал таблицу ExtendedRetentionSites, она была создана и заполнена мной как владельцем.Я понял это и заново создал таблицу с DBO в качестве владельца, заполнив эту таблицу, но никогда не удаляя таблицу с тем же именем, которое у меня было.Я запустил оператор вставки, и он вставился в принадлежащие мне ExtendedRetentionSites, но эти данные так и не попали в таблицу, принадлежащую DBO.

Оооочень, когда я запускал сценарий выбора, он использовал принадлежащие мне ExtendedRetentionSitesновый ряд, который даст мне результаты, которые я искал.Когда я запускал UDF, он использовал таблицу, которой владел DBO, без новой строки, таким образом, ничего не возвращая и не считая нуля.

Спасибо всем, кто помог мне с этим, я теперь вытащу свою голову измоя задница и возвращайся к работе.

Еще раз спасибо всем !!!!

0 голосов
/ 16 марта 2012

Я бы изменил функцию на это, убери отсчет из подзапроса:

CREATE FUNCTION [dbo].[HasExtendedRetentionSamples] (@BoxNumber varchar(20))
RETURNS  int

AS  

BEGIN 

      declare @cnt int
      set @cnt  = 0

      select @cnt = count(*)
            from tFreezerBoxInfo bi
            inner join tFreezerDetails fd on fd.boxTrayId = bi.boxTrayId
            inner join tncDrugTestListNew dt on dt.labnumber = fd.labnumber
            inner join ExtendedRetentionSites a on dt.number = a.number
            where boxnumber = 'ND011811001'
            and 
            case isnull([retention],0)
                when 0 then proposedDestructionDate
                else dateadd(dd,abs([retention]),proposedDestructionDate)
            end  <> proposedDestructionDate

      return @cnt

END

попробуйте изменить выражение CASE на:

case 
    when isnull([retention],0) = 0 then proposedDestructionDate
    else dateadd(dd,abs([retention]),proposedDestructionDate)
end  <> proposedDestructionDate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...