2014-07-22 59 views
0

我有一個函數,我已經設置爲返回一個INT函數,從傳遞給函數的日期計算,偶爾函數返回NULL是我所期望的一次又一次,但不是將調用函數封裝在ISNULL中以返回「N/A」,我怎麼能在函數中做到這一點。返回N/A當從返回INT的函數返回NULL - SQL SERVER

可以返回多個數據類型 - 一次不超過一個 - 但是如果返回值爲NULL,則返回INT或Varchar?我的標量函數如下。它創建的週數(1-4)從上週六28天的時間內一個臨時表,然後用它來返回傳遞給函數的日期相關聯的週數:

ALTER FUNCTION [dbo].[daterangeweeknumber] 
(
-- Add the parameters for the function here 

@refdate datetime 

) 

RETURNS int 
AS 
BEGIN 

-- Run procedure to populate table 



-- Declare the return variable here 
DECLARE @weeknumber int 
DECLARE @mytemptablevariable table (weeknumber INT,fromdate DATETIME,todate DATETIME) 
DECLARE @lastsaturdaydate DATETIME 

set @lastsaturdaydate = DATEADD(DAY, DATEDIFF(DAY, '18991230', GETDATE())/7 * 7, '18991230') 

-- Add the T-SQL statements to compute the return value here 
INSERT INTO @mytemptablevariable 
values (1, DATEADD(DAY, -27, @lastsaturdaydate), DATEADD(DAY, -21, @lastsaturdaydate)) 
INSERT INTO @mytemptablevariable 
values (2, DATEADD(DAY, -20, @lastsaturdaydate), DATEADD(DAY, -14, @lastsaturdaydate)) 
INSERT INTO @mytemptablevariable 
values (3, DATEADD(DAY, -13, @lastsaturdaydate), DATEADD(DAY, -07, @lastsaturdaydate)) 
INSERT INTO @mytemptablevariable 
values (4, DATEADD(DAY, -6, @lastsaturdaydate), @lastsaturdaydate) 

select @weeknumber = weeknumber 
from @mytemptablevariable 
where @refdate >= fromdate AND @refdate <= todate 

-- Return the result of the function 
RETURN @weeknumber 

END 

編輯:和我只是意識到不能將INT和Varchar返回到同一列(DOH!),並且將返回值更改爲varchar會使一切變得更簡單!

+3

當值不適用時,確保將返回值保留爲NULL,並在稍後的時間將*格式*作爲N/A處理。 –

+0

@Damien_The_Unbeliever我完全同意你的看法。格式化是需要格式化的層(最終是前端)的角色。 SQL Server應該返回TRUE值的數據。 –

回答

0

使用,無論你調用函數

SELECT ISNULL(CAST(dbo.daterangeweeknumber(GETDATE()) AS VARCHAR(10), 'N/A') 
+0

感謝您的建議 - 我最終堅持只返回一個varchar值 – Andrew

0

下面你可以聲明你的函數返回一個sql_variant然後可以包含一個或int一些文字,但我強烈建議反對 - 你」我會傾向於發現自己以後會試圖以一種理智的方式來處理這些數據 - 這比您目前所做的僅僅是接受一個可以爲空的int