Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用CASE语句计算日期格式的SQL函数_Sql_Sql Server_Function_Case - Fatal编程技术网

使用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使用的内容?只是复制,显然是不必要的。