使用CASE语句计算日期格式的SQL函数
我正在尝试创建一个函数,根据输入的参数值返回正确的日期格式,但语法不太好。谁能让它工作起来,或者有更有效/更好的方法来做这件事使用CASE语句计算日期格式的SQL函数,sql,sql-server,function,case,Sql,Sql Server,Function,Case,我正在尝试创建一个函数,根据输入的参数值返回正确的日期格式,但语法不太好。谁能让它工作起来,或者有更有效/更好的方法来做这件事 CREATE FUNCTION fn_DateFormat ( @DateFormat nvarchar(MAX) ) RETURNS NVARCHAR(30) AS BEGIN SET CASE WHEN @DateFormat = 'YYYYMMDD' THEN RETURN CONVERT(nvar
CREATE FUNCTION fn_DateFormat
(
@DateFormat nvarchar(MAX)
)
RETURNS NVARCHAR(30)
AS
BEGIN
SET CASE
WHEN @DateFormat = 'YYYYMMDD'
THEN RETURN CONVERT(nvarchar(30), GETDATE(), 112)
WHEN @DateFormat = 'DD MMM YYYY'
THEN RETURN CONVERT(nvarchar(30), GETDATE(), 106)
ELSE NULL
END
RETURN @DateFormat
END;
GO
我收到以下错误消息:
Msg 156,第15级,状态1,程序fn_日期格式,第12行关键字“CASE”附近的语法不正确 Msg 156,第15级,状态1,程序fn_日期格式,第14行
关键字“WHEN”附近的语法不正确 Msg 156,第15级,状态1,程序fn_日期格式,第15行
关键字“ELSE”附近的语法不正确 Msg 102,15级,状态1,程序fn_日期格式,第19行
“;”附近的语法不正确
以下是作为独立语句的语法:
SELECT CASE
WHEN @DateFormat = 'YYYYMMDD' THEN CONVERT(nvarchar(30), GETDATE(), 112)
WHEN @DateFormat = 'DD MMM YYYY' THEN CONVERT(nvarchar(30), GETDATE(), 106)
ELSE @DateFormat
END
作为一个udf:
CREATE FUNCTION fn_DateFormat
(
@DateFormat nvarchar(MAX)
)
RETURNS NVARCHAR(30)
AS
BEGIN
declare @ret NVARCHAR(30)
select @ret =
CASE
WHEN @DateFormat = 'YYYYMMDD' THEN CONVERT(nvarchar(30), GETDATE(), 112)
WHEN @DateFormat = 'DD MMM YYYY' THEN CONVERT(nvarchar(30), GETDATE(), 106)
ELSE @DateFormat
end
return @ret
end
您以不正确的方式使用了
SET
。正确用法如下所示。请注意,SET
后面必须跟有您试图设置的变量名。此外,您不应该从案例
函数内部返回。我在下面发布的代码中处理了这两个问题,应该可以正常工作
CREATE FUNCTION fn_DateFormat
(
@DateFormat nvarchar(MAX)
)
RETURNS NVARCHAR(30)
AS
BEGIN
SET @DateFormat = CASE
WHEN @DateFormat = 'YYYYMMDD'
THEN CONVERT(nvarchar(30), GETDATE(), 112)
WHEN @DateFormat = 'DD MMM YYYY'
THEN CONVERT(nvarchar(30), GETDATE(), 106)
ELSE NULL
END
RETURN @DateFormat
END;
GO
参数不正确,请使用变量名(即DateFormat)。只是猜测一下,但我希望它是SET@VARIABLE=CASE,然后在T-SQL中END
CASE
不是可以用来控制程序流的语句-它是一个只能向调用方返回值的表达式,例如,存储在一个变量中。读取帮助很大。为什么要为此使用函数?您的用户键入DD MMM YYYY
比记住106
更容易吗?你的表现会因此受到重创,这值得吗?DRY在许多语言中都是一个合理的原则,但在T-SQL中却不是。是否有理由将@DateFormat
声明为nvarchar(MAX)
,或者您只是复制OP使用的内容?只是复制,显然是不必要的。