2012-03-15 66 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