MS SQL标量函数,用于基于语言开关格式化数据

MS SQL标量函数,用于基于语言开关格式化数据,sql,user-defined-functions,date-format,scalar,Sql,User Defined Functions,Date Format,Scalar,我创建了一个标量函数,它应该根据变量以特定的格式输出日期。 由于某种原因,我在“else”周围出现了一个错误 我做错了什么 CREATE FUNCTION [dbo].[fGetDateformat] (@datum datetime,@CNotation char(2)) /* accepts datum and CNotation USAGE: select fGetDateformat(datum, "EN" or "DE") */ returns varchar(25) AS

我创建了一个标量函数,它应该根据变量以特定的格式输出日期。 由于某种原因,我在“else”周围出现了一个错误

我做错了什么

CREATE FUNCTION [dbo].[fGetDateformat] (@datum datetime,@CNotation char(2))
/*    accepts datum and CNotation
USAGE:
select fGetDateformat(datum, "EN" or "DE")    */
returns varchar(25) AS
BEGIN
declare @ReturnStr varchar(25)
if @Cnotation = 'DE'
set language german
set @ReturnStr = 
DATENAME(dd, @datum)+'. '+DATENAME(MM, @datum)+' '+ DATENAME(YEAR, @datum)
else
set @ReturnStr = DATENAME(mm, @datum)+' '+DATENAME(dd, @datum)+', '+ DATENAME(YEAR, @datum) 
return @ReturnStr
END
GO

如果T-SQL块跨越多行,则必须将其括在
begin
end
中。例如,这将不起作用:

if 1=1
    print 'One is one!'
    print 'Yay'
else
    print 'Huh?'
这将:

if 1=1
    begin
    print 'One is one!'
    print 'Yay'
    end
else
    print 'Huh?'

请注意,
打印'Huh?'
仍然可以,因为它是一行。

您使用的是哪个版本的SQL Server?如果你在2012年,你可以简单地使用format函数。这看起来非常像应该在你的应用层而不是SQL中处理的事情。您也无法在函数中设置语言,您将得到以下错误:
在函数中无效使用副作用运算符“set COMMAND”。
如果必须在SQL中执行此操作,我建议使用一个日历表,其中包含不同国家/地区日期格式的列,然后,您可以执行类似于
CASE WHEN@cnotion='DE',然后GermandTestRing WHEN@cnotion='US',然后是USDateString ELSE DefaultDateString END的操作
非常同意应该在应用程序层处理它。我正在使用一个法律案例管理系统,它提供sql作为生成信函的脚本环境。应用层在这里不提供对其格式的访问(它们在别处提供),所以我只能使用SQL。一直在考虑一个日历表,但想通过使用set language命令来避免这项工作。。。