Localiser un DateName en T-SQL

Un peu de SQL une fois n’est pas coutume. Si vous voulez faire une belle dimension Temps  pour un cube Analysis Services, vous pouvez utiliser le pattern de Jamie/Charles-Henri, mais si vous souhaitez en plus fournir des NameColumn localisées – pour traduire un cube? – vous allez probablement faire un pataquès SSIS monstrueux, ou gérer un référentiel de temps qui fait forcément doublon puisque SQL Server en possède un, certes pas sous la forme la plus agréable qui soit, dans la table syslanguages!

Bon prince, je vous fournis un exemple, avec les mois, à vous de l’étendre à tout (WK, DAY…) si ça vous botte.

CREATE FUNCTION [dbo].[MonthNameLocalized](@MonthNumberOfYear INT,@LCID INT)
RETURNS NVARCHAR(50)
BEGIN
	RETURN
	(
		SELECT
			[MonthName]
		FROM
		(
			SELECT
				alias,
				lcid,
				CAST('<value>'+REPLACE(months,',','</value><value>')+'</value>' AS XML) MonthsXML
			FROM master.dbo.syslanguages
		) Languages
		CROSS APPLY
		(
			SELECT
				ROW_NUMBER() OVER (ORDER BY (SELECT 0)) MonthNumberOfYear,
				[Month].[MonthName].value('.', 'nvarchar(50)') [MonthName]
			FROM Languages.MonthsXML.nodes('value') AS [Month]([MonthName])
			WHERE lcid = @LCID
		) M
		WHERE MonthNumberOfYear = @MonthNumberOfYear
	)
END

Vous pouvez le tester en standalone:

SELECT dbo.MonthNameLocalized(1,1033) --January
SELECT dbo.MonthNameLocalized(4,1036) --Avril
SELECT dbo.MonthNameLocalized(5,1040) --Maggio

Ou dans une dimension temps:

;WITH TimeIterator(CurrentDate) as
(
	SELECT DATEFROMPARTS(2000,1,1)
	UNION ALL
	SELECT DATEADD(DAY,1,CurrentDate)
	FROM TimeIterator
	WHERE DATEADD(DAY,1,CurrentDate) < = DATEFROMPARTS(2020,1,1)
)

SELECT
	CONVERT(INT, CONVERT(VARCHAR(8),CurrentDate,112)) DateID
	, MONTH (CurrentDate) as MonthNumberOfYear
	, [dbo].[MonthNameLocalized](MONTH (CurrentDate),1036) AS [FrenchMonthName]
	, [dbo].[MonthNameLocalized](MONTH (CurrentDate),1033) AS [EnglishMonthName]
FROM TimeIterator
OPTION (MAXRECURSION 0)

Ce qui donne un truc comme ça:

Capture
A bientôt!

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s