函数中的Sql Server日期语言

时间:2013-10-18 13:25:09

标签: sql-server datetime internationalization scope

最初为Oracle编写的代码已转换为使用SQL Server。 但是,法国目前存在一个问题,日期名称以英文显示。 这是因为CONVERT用于更改格式,但SET LANGUAGE不用于更改会话的语言(而Oracle语言包含在to_char函数中,它提供了等效的转换。)< / p>

深入了解我认为SET LANGUAGE未被使用,因为代码位于函数中 - 并且因为set具有副作用,因此无法将其包括在内。

有没有人知道解决这个问题的方法;即更改函数中单个语句的语言,而不是影响整个会话?

修改

为了更好地说明我的问题,想象一下尝试在SQL中重新创建Oracle功能 - 例如如下。

--this won't work because SET LANGUAGE affects the state of the session; 
create function dbo.to_char(@date datetime, @format nvarchar(32), @language nvarchar(32))
returns nvarchar(32)
as 
begin
      declare @result nvarchar(32)
      , @formatSql int

      --here we need to map the available Oracle options to their SQL equivs
      --SQL is more restrictive in that it uses predefined date formats rather than masks
      --I can't recall the typical valid oracle format masks - but just append to this those that you use
      set @formatSql = 
      case @format
            when 'dd mon yyyy' then 106
            when 'mon dd yyyy' then 107
            when 'dd/mm/yyyy'  then 103
            when 'mm/dd/yyyy'  then 101
            else 121 --default to yyyy-mm-dd hh:mi:ss.mmm(24h)
      end

      select @language = REPLACE(@language,'NLS_DATE_LANGUAGE','')
      , @language = REPLACE(@language,'=','')
      , @language = REPLACE(@language,' ','')

      set language @language 

      set @result = CONVERT(nvarchar(32), @date, @formatSql)

      set language English --revert session language

      return @result
end
go


select dbo.to_char(getutcdate(), 'dd mon yyyy', 'NLS_DATE_LANGUAG = French') --from dual ;)

提前致谢。

1 个答案:

答案 0 :(得分:1)

此代码将在函数中运行,并为您提供一个表,其中包含每个月的大写法语的数字和缩写。然后,您可以使用它来构建格式化日期。

Declare @months varchar(200)

select @months = shortmonths
from sys.syslanguages
where lcid = 1036 --i.e. French

Declare @individual varchar(20) = null
declare @monthsTable table (monthNumber int identity(1,1), name nvarchar(20))

WHILE LEN(@months) > 0
BEGIN
    IF PATINDEX('%,%',@months) > 0
    BEGIN
        SET @individual = SUBSTRING(@months, 0, PATINDEX('%,%',@months))
        SET @months = SUBSTRING(@months, LEN(@individual + ',') + 1, LEN(@months))
    END
    ELSE
    BEGIN
        SET @individual = @months
        set @months = null
    END
    insert into @monthsTable(name) select UPPER(@individual) 
END

出于好奇,你有没有理由在前端不这样做? Sql并不适合格式化任务。