2012-03-15 39 views
1

我建立这个UDFUDF不返回相同的值选择包含在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,这是不正确,

当我执行包含在UDF中的SQL语句(用'ND011811001'代替@BoxNumber)时...

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,这是正确的。

所以最大的问题是WHY?

连接& case语句中的所有数据类型都是相同的。

+0

我注意到你的UDF使用的是硬编码的BoxNumber值,而不是你传入的参数。这可能没有什么区别,但它肯定是你在声明函数“完成”之前想要改变的东西。 – 2012-03-15 21:11:28

回答

0

我不好意思地说,我已经找到为什么发生这种情况.....

当我创建表ExtendedRetentionSites时,创建了&作为所有者填充我。我意识到这一点,并重新创建了DBO作为所有者的表,填充此表,但从不删除与我拥有的同名的表。我运行了插入语句&,它插入到我拥有的ExtendedRetentionSites中,但是这些数据从未将其添加到DBO拥有的表中。

Soooooo当我运行选择脚本时,它使用了我拥有的ExtendedRetentionSites,它拥有新的行,它会给我我正在寻找的结果。当我运行UDF时,它使用了DBO拥有的表,没有新行,因此不返回任何数或零计数。

感谢所有帮助过我的人,我现在将我的头伸出屁股&重新开始工作。

再次感谢所有!

+0

很高兴你终于明白了。你让我难以理解它为什么不起作用。 – Taryn 2012-03-16 17:28:55

+0

您应该将答案标记为已接受,以便其他人知道您的问题已解决。 – Taryn 2012-03-17 14:02:51

0

我将功能切换到这一点,把算出来的子查询:

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 
+0

感谢您的建议,但我已经尝试过建议,它没有工作.... – larryr 2012-03-15 20:23:56

+1

如果您通过选择运行声明代码然后使用print @cnt,你会得到什么? – Taryn 2012-03-15 20:25:19

+0

我在寻找什么...... 5 – larryr 2012-03-15 20:28:27