【发布时间】:2014-07-22 10:26:24
【问题描述】:
我有一个函数,我设置它返回一个 INT 周数,它是根据传递给函数的日期计算得出的,有时该函数返回 NULL,这是我不时期望的,但不是包装调用ISNULL 中的函数返回“N/A”我如何在函数中执行此操作。
是否可以返回一种以上的数据类型——一次不超过一种——但如果返回值为 NULL,则可以返回 INT 或 Varchar?我的标量函数如下。它为从上周六开始的 28 天期间创建一个包含周数 (1-4) 的临时表,然后使用它返回传递给函数的日期的相关周数:
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!)并且将 return 更改为 varchar 会使一切变得更简单!
【问题讨论】:
-
当返回值不适用时,将返回值保留为
NULL并在稍后处理N/A的formatting 确实会更干净。 -
@Damien_The_Unbeliever 我完全同意你的看法。格式化是需要格式化的层的角色(通常是前端)。 SQL Server 应该返回数据的 TRUE 值。
标签: sql-server function date-range isnull