Une collection d'UDF de toute nature pour satisfaire certains besoin. Le tout en vrac !
/****************************************************************************/
-- mise en majuscule de la première lettre et minuscule de toutes les autres
/****************************************************************************/
CREATE FUNCTION FN_FIRST_CAP (@NAMEVARCHAR(8000))
RETURNSVARCHAR(8000)
ASBEGINIF @NAMEISNULL
RETURN NULLIF LEN(@NAME) = 1
RETURN UPPER(@NAME)
RETURN UPPER(SUBSTRING(@NAME, 1, 1)) +
LOWER(SUBSTRING(@NAME, 2, LEN(@NAME) -1))
ENDGO
/****************************************************************************/
-- table des jours de semaine
/****************************************************************************/
CREATE FUNCTION FN_JOUR_SEMAINE ()
RETURNSTABLEAS
RETURN (SELECT 1 AS N, 'Lundi' AS JOUR
UNION
SELECT 2 AS N, 'Mardi' AS JOUR
UNION
SELECT 3 AS N, 'Mercredi' AS JOUR
UNION
SELECT 4 AS N, 'Jeudi' AS JOUR
UNION
SELECT 5 AS N, 'Vendredi' AS JOUR
UNION
SELECT 2 AS N, 'Samedi' AS JOUR
UNION
SELECT 2 AS N, 'Dimanche' AS JOUR)
GO
/****************************************************************************/
-- calcul de la date de Pâque
/****************************************************************************/
CREATE FUNCTION FN_PAQUE (@AN INT)
RETURNS DATETIME
ASBEGINIF @AN ISNULL
RETURN NULLDECLARE @G INT
DECLARE @I INT
DECLARE @J INT
DECLARE @C INT
DECLARE @H INT
DECLARE @L INT
DECLARE @JourPaque INT
DECLARE @MoisPaque INT
DECLARE @DimPaque DATETIME
SET @G = @AN % 19
SET @C = @AN / 100
SET @H = (@C - @C / 4 - (8 * @C + 13) / 25 + 19 * @G + 15) % 30
SET @I = @H - (@H / 28) * (1 - (@H / 28) * (29 / (@H + 1)) * ((21 - @G) / 11))
SET @J = (@AN + @AN / 4 + @I + 2 - @C + @C / 4) % 7
SET @L = @I - @J
SET @MoisPaque = 3 + (@L + 40) / 44
SET @JourPaque = @L + 28 - 31 * (@MoisPaque / 4)
SET @DimPaque = CAST(CAST(@AN ASVARCHAR(4)) +
CASE
WHEN @MoisPaque < 10 THEN '0' + CAST(@MoisPaque AS CHAR(1))
ELSE CAST(@MoisPaque AS CHAR(2))
END +
CASE
WHEN @JourPaque < 10 THEN '0' + CAST(@JourPaque AS CHAR(1))
ELSE CAST(@JourPaque AS CHAR(2))
ENDAS DATETIME)
RETURN @DimPaque
ENDGO
/****************************************************************************/
-- Transformation d'un entier en chaine binaire VARCHAR
/****************************************************************************/
CREATE FUNCTION FN_INT_TO_BIT (@I INT)
RETURNSVARCHAR(512)
ASBEGIN-- effet de bordIF @I ISNULL
RETURN NULL-- valeur basiqueIF @I = 0
RETURN '0'
-- signe négatifDECLARE @SIGNE VARCHAR(1)
SET @SIGNE = ''
IF @I < 0
SET @SIGNE = '-'
-- conversion DECLARE @BIT_OUT VARCHAR(512)
SET @BIT_OUT = ''
WHILE NOT @I = 0
BEGINIF @I % 2 = 0
SET @BIT_OUT = '0' + @BIT_OUT
ELSESET @BIT_OUT = '1' + @BIT_OUT
SET @I = @I / 2
END
RETURN @SIGNE + @BIT_OUT
ENDGO
/****************************************************************************/
-- retourne le nom de l'utilisateur d'un id (userid) donné
/****************************************************************************/
CREATE FUNCTION FN_FORMATUSER(@USERID SMALLINT) RETURNSVARCHAR(32) ASBEGIN
RETURN(CAST(SUBSTRING(USER_NAME(@USERID), 1, 32) ASVARCHAR(32)))
ENDGO
/****************************************************************************/
-- retourne une chaine interprétable en chaine SQL
/****************************************************************************/
CREATE FUNCTION FN_QUOTESTR(@S VARCHAR(8000))
RETURNSVARCHAR(8000)
ASBEGINDECLARE @OUT VARCHAR(8000)
SET @OUT = CASE
WHEN @S ISNULLTHEN 'NULL'
ELSE ''''+REPLACE(@S, '''', '''''')+''''
END
RETURN (@OUT)
ENDGO
/****************************************************************************/
-- retourne une chaine de caractère représentant une date au format ISO
/****************************************************************************/
CREATE FUNCTION FN_DATEISO(@D DATETIME)
RETURNSVARCHAR(8000)
ASBEGINDECLARE @OUT VARCHAR(12)
SET @OUT = CASE
WHEN @D ISNULLTHEN 'NULL'
ELSE ''''+CONVERT(CHAR(10), @D, 121)+''''
END
RETURN (@OUT)
ENDGO
/****************************************************************************/
-- obtient la liste des colonnes d'une table
/****************************************************************************/
CREATE FUNCTION FN_LISTCOLS (@NOM_TABLE VARCHAR(128))
RETURNSVARCHAR(8000) ASBEGINDECLARE @RETVAL VARCHAR(8000)
SET @RETVAL = ''
SELECT @RETVAL = @RETVAL +COLUMN_NAME+', '
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @NOM_TABLE
IF @RETVAL ISNULL
RETURN NULLIF @RETVAL = ''
RETURN NULLSET @RETVAL = SUBSTRING(@RETVAL, 1, LEN(@RETVAL) -1)
RETURN @RETVAL
ENDGO
/****************************************************************************/
-- purge de caractères indésirables
/****************************************************************************/
-- exemple : FN_RESTRICT('à Paris...?', 'abcdefghijklmnopqrstuvwxyz') => 'aris'CREATE FUNCTION FN_RESTRICT (@INVARCHAR (8000),
@CHARSOK VARCHAR(256))
RETURNSVARCHAR (8000)
ASBEGIN-- effets de bordIF @INISNULL
RETURN NULLIF @CHARSOK ISNULL
RETURN NULLIF LEN(@IN) = 0
RETURN @IN-- initialisationDECLARE @I INTEGERDECLARE @OUT VARCHAR(8000)
SET @OUT = ''
-- lecture caractère par caractèreSET @I =1
WHILE @I <= LEN(@IN)
BEGINIF PATINDEX('%' + SUBSTRING(@IN, @I, 1)+ '%', @CHARSOK) > 0
SET @OUT = @OUT + SUBSTRING(@IN, @I, 1)
SET @I = @I + 1
END
RETURN @OUT
ENDGO
/****************************************************************************/
-- conversion d'heure minute seconde littérale en heure décimale
/****************************************************************************/
CREATE FUNCTION FN_CONVERT_HMS_HD (@HMS CHAR(8))
RETURNS FLOAT
ASBEGINDECLARE @H FLOAT
DECLARE @M FLOAT
DECLARE @S FLOAT
DECLARE @RETVAL FLOAT
-- cas trivialIF @HMS ISNULL
RETURN NULL-- voir si saisie erronée (pas de chiffres)SET @HMS = REPLACE(@HMS, ':', '')
IF LEN(@HMS) <> 6
RETURN NULLDECLARE @I INTEGERSET @I = 1
WHILE @I < 7
BEGINIF SUBSTRING(@HMS, @I, 1) NOTBETWEEN '0' AND '9'
RETURN NULLSET @I = @I + 1
END-- la saisie est correcteSET @H = CAST(SUBSTRING(@HMS, 1, 2) AS FLOAT)
SET @M = CAST(SUBSTRING(@HMS, 3, 2) AS FLOAT) / 60.0
SET @S = CAST(SUBSTRING(@HMS, 5, 2) AS FLOAT) / 3600.0
SET @RETVAL = @H + @M + @S
RETURN @RETVAL
ENDGO
/****************************************************************************/
-- Compte le nombre d'occurences d'une sous chaine dans une chaine
/****************************************************************************/
CREATE FUNCTION dbo.FN_COUNTSTR (@STR VARCHAR(8000), @PATTERN VARCHAR(8000))
RETURNSINTEGERASBEGINDECLARE @I INTEGER-- cas trivial données en entrée NULLIF @STR ISNULLOR @PATTERN ISNULLBEGINSET @I = NULL
RETURN @I
END-- cas trivial données en entrée videIF @STR ='' OR @PATTERN =''
BEGINSET @I = 0
RETURN @I
END-- cas généralDECLARE @STR2 VARCHAR(8000)
SET @STR2 = @STR
SET @I = 0
WHILE PATINDEX('%'+@PATTERN+'%', @STR2) > 0
BEGINSET @I = @I +1
IF LEN(@STR2) > PATINDEX('%'+@PATTERN+'%', @STR2) + LEN(@PATTERN)
SET @STR2 = SUBSTRING(@STR2, PATINDEX('%'+@PATTERN+'%', @STR2)
+ LEN(@PATTERN), LEN(@STR2) - PATINDEX('%'+@PATTERN+'%', @STR2)
- LEN(@PATTERN)+1)
ELSESET @STR2 = ''
END
RETURN @I
ENDGO
/****************************************************************************/
-- remplace un datetime par une datetime avec heure à zero
/****************************************************************************/
CREATE FUNCTION FN_DATETIME_AS_DATE (@DT DATETIME)
RETURNS DATETIME ASBEGIN
RETURN CAST(FLOOR(CAST(@DT AS FLOAT)) AS DATETIME)
ENDGO
/****************************************************************************/
-- soundex 2 (Celko SQL Avancé p 86)
/****************************************************************************/
CREATE FUNCTION FN_SOUNDEX2 (@NAMEVARCHAR (128))
RETURNS CHAR (4)
ASBEGINDECLARE @SNDX2 CHAR(4)
SET @SNDX2 = ' '
IF @NAMEISNULL
RETURN @SNDX2
DECLARE @FIRSTLET CHAR(1)
DECLARE @XGRAM VARCHAR(4)
-- mise en majusculeSET @NAME = UPPER(@NAME)
-- dé diacritisationSET @NAME = dbo.FN_TRANSLATE(@NAME, 'ÀÂÄÉÈÊËÎÏÔÖÙÛÜÇ', 'AAAEEEEIIOOUUUC')
-- restriction aux letttresSET @NAME = dbo.FN_RESTRICT(@NAME, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')
IF @NAME = ''
RETURN @SNDX2
-- substitution des préfixesIF LEN(@NAME) >= 3
BEGINSET @XGRAM = SUBSTRING(@NAME, 1, 3)
IF @XGRAM = 'MAC'
IF LEN(@NAME) = 3
SET @NAME = 'MCC'
ELSESET @NAME = 'MCC'+ SUBSTRING(@NAME, 4, LEN(@NAME) -3)
IF @XGRAM = 'SCH'
IF LEN(@NAME) = 3
SET @NAME = 'SSS'
ELSESET @NAME = 'SSS'+ SUBSTRING(@NAME, 4, LEN(@NAME) -3)
ENDIF LEN(@NAME) >= 2
BEGINSET @XGRAM = SUBSTRING(@NAME, 1, 2)
IF @XGRAM = 'KN'
IF LEN(@NAME) = 2
SET @NAME = 'NN'
ELSESET @NAME = 'NN'+ SUBSTRING(@NAME, 3, LEN(@NAME) -2)
IF @XGRAM = 'PF'
IF LEN(@NAME) = 2
SET @NAME = 'FF'
ELSESET @NAME = 'FF'+ SUBSTRING(@NAME, 3, LEN(@NAME) -2)
IF @XGRAM = 'PH'
IF LEN(@NAME) = 2
SET @NAME = 'FF'
ELSESET @NAME = 'FF'+ SUBSTRING(@NAME, 3, LEN(@NAME) -2)
ENDIF LEN(@NAME) >= 1
BEGINSET @XGRAM = SUBSTRING(@NAME, 1, 1)
IF @XGRAM = 'K'
IF LEN(@NAME) = 1
SET @NAME = 'C'
ELSESET @NAME = 'C'+ SUBSTRING(@NAME, 2, LEN(@NAME) -1)
END-- transformations sauf première lettre ''SET @FIRSTLET = SUBSTRING(@NAME, 1, 1)
IF LEN(@NAME) > 1
SET @NAME = dbo.FN_TRANSLATE(SUBSTRING(@NAME, 2, LEN(@NAME)-1), 'AEIOUY', 'AAAAAA')
ELSESET @NAME = ''
SET @NAME = REPLACE(@NAME, 'DG', 'GG')
SET @NAME = REPLACE(@NAME, 'CAAN', 'TAAN')
SET @NAME = REPLACE(@NAME, 'D', 'T')
SET @NAME = REPLACE(@NAME, 'NST', 'NSS')
SET @NAME = REPLACE(@NAME, 'AV', 'AF')
SET @NAME = REPLACE(@NAME, 'Q', 'G')
SET @NAME = REPLACE(@NAME, 'Z', 'S')
SET @NAME = REPLACE(@NAME, 'M', 'N')
SET @NAME = REPLACE(@NAME, 'KN', 'NN')
SET @NAME = REPLACE(@NAME, 'K', 'C')
-- remplacement des H par A sauf suivi et précédé par A (exemple '...AHA...')SET @NAME = REPLACE(@NAME, 'AHA', 'AhA')
SET @NAME = REPLACE(@NAME, 'H', 'A')
SET @NAME = REPLACE(@NAME, 'AhA', 'AHA')
-- remplacements diversSET @NAME = REPLACE(@NAME, 'AW', 'A')
SET @NAME = REPLACE(@NAME, 'PH', 'FF')
SET @NAME = REPLACE(@NAME, 'SCH', 'SSS')
-- suppression A en fin de mot
WHILE SUBSTRING(@NAME, LEN(@NAME), 1) = 'A'
IF LEN(@NAME) > 1
SET @NAME = SUBSTRING(@NAME, 1, LEN(@NAME)-1)
ELSESET @NAME = ''
-- suppression S en fin
WHILE SUBSTRING(@NAME, LEN(@NAME), 1) = 'S'
IF LEN(@NAME) > 1
SET @NAME = SUBSTRING(@NAME, 1, LEN(@NAME)-1)
ELSESET @NAME = ''
-- supression NT en finIF LEN(@NAME) >= 2
IF SUBSTRING(@NAME, LEN(@NAME)-1, 2) = 'NT'
IF LEN(@NAME) > 2
SET @NAME = SUBSTRING(@NAME, 1, LEN(@NAME) -2)
-- suppression des ASET @NAME = REPLACE(@NAME, 'A', '')
-- test effet de bord : @NAME videIF @NAME = ''
BEGINSET @SNDX2 = @FIRSTLET +' '
RETURN @SNDX2
END-- suppression des répétitionsDECLARE @OUT VARCHAR(4)
SET @OUT = @FIRSTLET
DECLARE @I INTEGERDECLARE @C CHAR(1)
DECLARE @CC CHAR(1)
SET @I = 1
SET @CC = ''
WHILE @I <= LEN(@NAME)
BEGINSET @C = SUBSTRING(@NAME, @I, 1)
IF @C <> @CC
BEGINIF LEN(@OUT) < 4
SET @OUT = @OUT + @C
SET @CC = @C
ENDIF LEN(@OUT) = 4
BREAK
SET @I = @I + 1
ENDSET @SNDX2 = @OUT
RETURN @SNDX2
ENDGO
/****************************************************************************/
-- remplacement par substitution de caractères
/****************************************************************************/
-- exemple : FN_TRANSLATE('à Paris...', 'à.', 'a') => 'a paris'CREATE FUNCTION FN_TRANSLATE (@VALIN VARCHAR (8000),
@FROMVARCHAR(256), @TO VARCHAR(256))
RETURNSVARCHAR (8000)
ASBEGIN-- effets de bordIF @VALIN ISNULL
RETURN NULLIF @FROMISNULLOR @TO ISNULL
RETURN NULLIF LEN(@VALIN) = 0
RETURN @VALIN
-- initialisationDECLARE @I INTEGERDECLARE @OUT VARCHAR(8000)
SET @OUT = ''
-- lecture caractère par caractèreSET @I =1
WHILE @I <= LEN(@VALIN)
BEGINIF PATINDEX('%' + SUBSTRING(@VALIN, @I, 1)+ '%', @FROM) > 0
BEGINIF LEN(@TO) >= PATINDEX('%' + SUBSTRING(@VALIN, @I, 1)+ '%', @FROM)
SET @OUT = @OUT + SUBSTRING(@TO, PATINDEX('%' + SUBSTRING(@VALIN, @I, 1)+ '%', @FROM), 1)
ENDELSESET @OUT = @OUT + SUBSTRING(@VALIN, @I, 1)
SET @I = @I + 1
END
RETURN @OUT
ENDGO
/****************************************************************************/
-- conversion d'heure décimale en heure minute seconde littérale
/****************************************************************************/
CREATE FUNCTION FN_CONVERT_HD_HMS (@HD FLOAT)
RETURNSVARCHAR(8)
ASBEGINDECLARE @H INTEGERDECLARE @M INTEGERDECLARE @S INTEGERDECLARE @RETVAL VARCHAR(8)
-- cas trivialIF @HD ISNULL
RETURN NULL-- récupération des heures, minutes, secondesSET @H = FLOOR(@HD)
SET @HD = @HD - @H
SET @HD = @HD * 60
SET @M = FLOOR(@HD)
SET @HD = @HD - @M
SET @HD = @HD * 60
SET @S = FLOOR(@HD)
IF @H < 10
SET @RETVAL = '0'+CAST(@H AS CHAR(1))+':'
ELSESET @RETVAL = CAST(@H AS CHAR(2))+':'
IF @M < 10
SET @RETVAL = @RETVAL + '0' + CAST(@M AS CHAR(1))+':'
ELSESET @RETVAL = @RETVAL + CAST(@M AS CHAR(2))+':'
IF @S < 10
SET @RETVAL = @RETVAL + '0' + CAST(@S AS CHAR(1))
ELSESET @RETVAL = @RETVAL + CAST(@S AS CHAR(2))+':'
RETURN @RETVAL
ENDGO
/****************************************************************************/
-- affichage heure et minute extrait d'une date
/****************************************************************************/
CREATE FUNCTION FN_DATETIME_AS_HM (@DT DATETIME)
RETURNS CHAR(5) ASBEGINIF @DT ISNULL RETURN NULLDECLARE @H INT
DECLARE @M INT
SET @H = DATEPART(HOUR, @DT)
SET @M = DATEPART(MINUTE, @DT)
DECLARE @RETVAL VARCHAR(5)
IF @H < 10
SET @RETVAL = '0' + CAST(@H AS CHAR(1))+':'
ELSESET @RETVAL = CAST(@H AS CHAR(2))+':'
IF @M < 10
SET @RETVAL = @RETVAL + '0' + CAST(@M AS CHAR(1))
ELSESET @RETVAL = @RETVAL + CAST(@M AS CHAR(2))
RETURN CAST(@RETVAL AS CHAR(5))
ENDGO
/****************************************************************************/
-- remplace un datetime par une datetime avec date à zero
/****************************************************************************/
CREATE FUNCTION FN_DATETIME_AS_HOUR (@DT DATETIME)
RETURNS DATETIME ASBEGIN
RETURN CAST(CAST(@DT AS FLOAT) - FLOOR(CAST(@DT AS FLOAT)) AS DATETIME)
ENDGO
/****************************************************************************/
-- compléte avec des zéros un nombre converti en chaine de caractères
/****************************************************************************/
CREATE FUNCTION dbo.FN_PAD_ZERO (@INT INTEGER, @NBR_ZERO INTEGER)
RETURNSVARCHAR(8000)
ASBEGINDECLARE @OUT VARCHAR(8000)
-- cas trivial @NBR_ZERO est NULLIF @NBR_ZERO ISNULL
RETURN @OUT
-- cas trivial @NBR_ZERO < longueur de @INTIF @INT ISNOTNULLIF @NBR_ZERO < LEN(CAST(@INT ASVARCHAR(8000)))
RETURN @OUT
-- cas généralSET @OUT = CAST(@INT ASVARCHAR(8000))
WHILE LEN(@OUT) < @NBR_ZERO
BEGINSET @OUT = '0'+@OUT
END
RETURN @OUT
ENDGO
/****************************************************************************/
/* conversion code hexa en décimal */
/****************************************************************************/
CREATE FUNCTION FN_HEX_TO_DEC (@HEX VARCHAR(16))
RETURNS BIGINT
ASBEGIN-- effet de bordIF @HEX ISNULL
RETURN NULL-- valeur basiqueSET @HEX = RTRIM(LTRIM(UPPER(@HEX)))
IF @HEX = ''
RETURN NULL-- signe négatifDECLARE @SIGNE VARCHAR(1)
SET @SIGNE = ''
IF SUBSTRING(@HEX, 1, 1) = '-'
BEGINSET @SIGNE = '-'
SET @HEX = SUBSTRING(@HEX, 2, LEN(@HEX) - 1)
ENDIF SUBSTRING(@HEX, 1, 1) = '+'
BEGINSET @SIGNE = ''
SET @HEX = SUBSTRING(@HEX, 2, LEN(@HEX) - 1)
ENDSET @HEX = RTRIM(@HEX)
-- conversionDECLARE @INT_OUT BIGINT
DECLARE @CHR CHAR(1)
DECLARE @I INT
SET @INT_OUT = 0
SET @I = 0
WHILE @I < LEN(@HEX)
BEGINSET @CHR = SUBSTRING(@HEX, LEN(@HEX) - @I, 1)
SET @INT_OUT = @INT_OUT + POWER(16, @I) * CASE @CHR
WHEN '0' THEN 0
WHEN '1' THEN 1
WHEN '2' THEN 2
WHEN '3' THEN 3
WHEN '4' THEN 4
WHEN '5' THEN 5
WHEN '6' THEN 6
WHEN '7' THEN 7
WHEN '8' THEN 8
WHEN '9' THEN 9
WHEN 'A' THEN 10
WHEN 'B' THEN 11
WHEN 'C' THEN 12
WHEN 'D' THEN 13
WHEN 'E' THEN 14
WHEN 'F' THEN 15
ELSENULLENDSET @I = @I + 1
END
RETURN @INT_OUT * CASE @SIGNE WHEN '-' THEN -1 ELSE 1 END
END
GO
-- liste toutes les colonnes d'une tableCREATE FUNCTION FN_LISTE_COLS (@TABLE_NAME VARCHAR(128))
RETURNSVARCHAR(8000)
ASBEGIN-- liste des noms de colonnes dansDECLARE @ColumnList VARCHAR(8000)
SET @ColumnList = ''
-- obtention de la liste des colonnes pour la requête de rechercheSELECT @ColumnList = @ColumnList + COLUMN_NAME +', '
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @TABLE_NAME
RETURN SUBSTRING(@ColumnList, 1, LEN(@ColumnList) -1)
ENDGO-- exemple d'utilisation :SELECT dbo.FN_LISTE_COLS('T_CONTACT_CTC')
/************************************************************
CALCUL DES SAISONS - basé sur l'algorithmes de Meeus
("Astronomical Algorithms", 1991) modifié par Simon Cassidy
-------------------------------------------------------------
Frédéric BROUARD - SQLpro - 2004-06-27 - Transact SQL
************************************************************/
CREATE FUNCTION FN_SUB_SEASONS (@JDME FLOAT(50))
RETURNS DATETIME
AS-- sous fonction utilisée par les 4 calculs de saisonsBEGINIF @JDME ISNULL
RETURN NULLDECLARE @T FLOAT(50)
DECLARE @S FLOAT(50)
DECLARE @W FLOAT(50)
DECLARE @L FLOAT(50)
DECLARE @JD FLOAT(50)
DECLARE @D DATETIME
SET @T = (@JDME - 2451545.0) / 36525
SET @S =
485 * COS(0.43563418129778464 + 33.757041381353048 * @T) +
203 * COS(0.64978608051748876 + 575.33848531501758 * @T) +
199 * COS(0.73443454923921381 + 0.35231216280757538 * @T) +
182 * COS(0.48607419668042079 + 7771.3771552463541 * @T) +
156 * COS(1.2765338149086527 + 786.04194554533876 * @T) +
136 * COS(1.2482594810263443 + 393.02097277266938 * @T) +
77 * COS(0.39339721339952183 + 1150.6769706300352 * @T) +
74 * COS(1.6880824525289155 + 52.969102188531025 * @T) +
70 * COS(0.76061448801912879 + 157.7343580417903 * @T) +
58 * COS(0.34574972482007665 + 588.4926828214484 * @T) +
52 * COS(1.69593643416289 + 2.6298272103200158 * @T) +
50 * COS(0.366868208769208 + 39.81490468210017 * @T) +
45 * COS(0.82972952639810416 + 522.36940057977904 * @T) +
44 * COS(0.43895030687657388 + 550.75533081445974 * @T) +
29 * COS(1.063429113240145 + 77.552256689088878 * @T) +
18 * COS(0.96202548369927443 + 1179.0629008647159 * @T) +
17 * COS(1.5496778428457652 + 79.629809364200341 * @T) +
16 * COS(1.7111207986552408 + 1097.7078858947966 * @T) +
14 * COS(1.7411404617895434 + 548.67777813934822 * @T) +
12 * COS(1.6648695734773908 + 254.43144545527034 * @T) +
12 * COS(1.5203563114122605 + 557.31427814345443 * @T) +
12 * COS(0.36320301734001997 + 606.97767436883066 * @T) +
9 * COS(0.48397980157802756 + 21.32991313471798 * @T) +
8 * COS(0.2696533694331239 + 294.24635013737048 * @T)
SET @W = ( 35999.373*@T - 2.47 ) * PI() / 180
SET @L = 1 + 0.0334*COS(@W) + 0.0007*COS(2*@W)
SET @JD = @JDME + (0.00001*@S/@L)
SET @JD = @JD - 2415020.50208142228
SET @D = CAST(FLOOR(@JD) AS DATETIME)
RETURN @D
ENDGOCREATE FUNCTION FN_WINTER_DATE (@Y INT)
RETURNS DATETIME
AS-- calcul de la date de début d'hiverBEGIN-- @Y est l'année considérée-- effets de bord : année absenteIF @Y ISNULL
RETURN NULL-- limites de calculs de l'an 1000 à l'an 3000IFNOT @Y BETWEEN 1000 AND 3000
RETURN NULLDECLARE @M FLOAT(50)
DECLARE @JDME FLOAT(50)
SET @M = (CAST(@Y AS FLOAT(50)) - 2000.0) / 1000.0
SET @JDME = 2451900.05952
+ 365242.74049 * @M
- 0.06223 * SQUARE(@M)
- 0.00823 * POWER (@M, 3)
+ 0.00032 * POWER (@M, 4)
RETURN dbo.FN_SUB_SEASONS (@JDME)
ENDGOCREATE FUNCTION FN_AUTUMN_DATE (@Y INT)
RETURNS DATETIME
AS-- calcul de la date de début d'automneBEGIN-- @Y est l'année considérée-- effets de bord : année absenteIF @Y ISNULL
RETURN NULL-- limites de calculs de l'an 1000 à l'an 3000IFNOT @Y BETWEEN 1000 AND 3000
RETURN NULLDECLARE @M FLOAT(50)
DECLARE @JDME FLOAT(50)
SET @M = (CAST(@Y AS FLOAT(50)) - 2000.0) / 1000.0
SET @JDME = 2451810.21715
+ 365242.01767 * @M
- 0.11575 * SQUARE(@M)
+ 0.00337 * POWER (@M, 3)
+ 0.00078 * POWER (@M, 4)
RETURN dbo.FN_SUB_SEASONS (@JDME)
ENDGOCREATE FUNCTION FN_SUMMER_DATE (@Y INT)
RETURNS DATETIME
AS-- calcul de la date de début de l'étéBEGIN-- @Y est l'année considérée-- effets de bord : année absenteIF @Y ISNULL
RETURN NULL-- limites de calculs de l'an 1000 à l'an 3000IFNOT @Y BETWEEN 1000 AND 3000
RETURN NULLDECLARE @M FLOAT(50)
DECLARE @JDME FLOAT(50)
SET @M = (CAST(@Y AS FLOAT(50)) - 2000.0) / 1000.0
SET @JDME = 2451716.56767
+ 365241.62603 * @M
+ 0.00325 * SQUARE(@M)
+ 0.00888 * POWER (@M, 3)
- 0.00030 * POWER (@M, 4)
RETURN dbo.FN_SUB_SEASONS (@JDME)
ENDGOCREATE FUNCTION FN_SPRING_DATE (@Y INT)
RETURNS DATETIME
AS-- calcul de la date de début du printempsBEGIN-- @Y est l'année considérée-- effets de bord : année absenteIF @Y ISNULL
RETURN NULL-- limites de calculs de l'an 1000 à l'an 3000IFNOT @Y BETWEEN 1000 AND 3000
RETURN NULLDECLARE @M FLOAT(50)
DECLARE @JDME FLOAT(50)
DECLARE @T FLOAT(50)
DECLARE @S FLOAT(50)
DECLARE @W FLOAT(50)
DECLARE @L FLOAT(50)
DECLARE @JD FLOAT(50)
DECLARE @D DATETIME
SET @M = (CAST(@Y AS FLOAT(50)) - 2000.0) / 1000.0
SET @JDME = 2451623.80984
+ 365242.37404 * @M
+ 0.05169 * SQUARE(@M)
- 0.00411 * POWER (@M, 3)
- 0.00057 * POWER (@M, 4)
RETURN dbo.FN_SUB_SEASONS (@JDME)
ENDGO
/***********************
EXEMPLE D'UTILISATION
***********************/
SELECT 'PRINTEMPS' AS SAISON, dbo.FN_SPRING_DATE(2000) AS DATE_DEBUT
UNION
SELECT 'ÉTÉ' AS SAISON, dbo.FN_SUMMER_DATE(2000) AS DATE_DEBUT
UNION
SELECT 'AUTOMNE' AS SAISON, dbo.FN_AUTUMN_DATE(2000) AS DATE_DEBUT
UNION
SELECT 'HIVER' AS SAISON, dbo.FN_WINTER_DATE(2000) AS DATE_DEBUT
ORDERBY 2
/************************************************************
CONVERSION DE NOMBRE EN LITTERAUX :
sous fonctions :
FN_NEC_20 : transformation des nombres de 1 à 19 en littéraux
FN_NEC_100 : transformation des nombres de 20 à 99 en littéraux
FN_NEC_0_100 : transformation des nombres de 0 à 100 en littéraux
fonction principale :
FN_NOMBRE_EN_CHIFFRE : transformation de n'importe quel nombre
entier de l'intervalle [- 2 147 483 648 ; 2 147 483 647]
-------------------------------------------------------------
Frédéric BROUARD - SQLpro - 2004-08-07 - Transact SQL
************************************************************/
CREATE FUNCTION FN_NEC_20 (@I INT)
RETURNSVARCHAR(16)
AS
/******************************************************************************
* Frédéric BROUARD - Sté DATA SAPIENS - 2004-08-07 *
* Sous procédure de transformation des nombres de 1 à 19 en littéraux *
******************************************************************************/
BEGINDECLARE @RETVAL VARCHAR(256)
SET @RETVAL =
CASE
WHEN @I=1 THEN 'UN'
WHEN @I=2 THEN 'DEUX'
WHEN @I=3 THEN 'TROIS'
WHEN @I=4 THEN 'QUATRE'
WHEN @I=5 THEN 'CINQ'
WHEN @I=6 THEN 'SIX'
WHEN @I=7 THEN 'SEPT'
WHEN @I=8 THEN 'HUIT'
WHEN @I=9 THEN 'NEUF'
WHEN @I=10 THEN 'DIX'
WHEN @I=11 THEN 'ONZE'
WHEN @I=12 THEN 'DOUZE'
WHEN @I=13 THEN 'TREIZE'
WHEN @I=14 THEN 'QUATORZE'
WHEN @I=15 THEN 'QUINZE'
WHEN @I=16 THEN 'SEIZE'
WHEN @I=17 THEN 'DIX-SEPT'
WHEN @I=18 THEN 'DIX-HUIT'
WHEN @I=19 THEN 'DIX-NEUF'
END
RETURN @RETVAL
ENDGOCREATE FUNCTION FN_NEC_100 (@I INT)
RETURNSVARCHAR(32)
AS
/******************************************************************************
* Frédéric BROUARD - Sté DATA SAPIENS - 2004-08-07 *
* Sous procédure de transformation des nombres de 20 à 99 en littéraux *
******************************************************************************/
BEGINDECLARE @RETVAL VARCHAR(256)
IFNOT(@I BETWEEN 20 AND 99)
RETURN @RETVAL
DECLARE @U CHAR(1)
SET @U = SUBSTRING(CAST(@I AS CHAR(2)), 2, 1)
SET @RETVAL =
CASE
WHEN @I = 20 THEN 'VINGT'
WHEN @I = 21 THEN 'VINGT ET UN'
WHEN @I BETWEEN 22 AND 29 THEN 'VING-' + dbo.FN_NEC_20(CAST(@U ASINTEGER))
WHEN @I = 30 THEN 'TRENTE'
WHEN @I = 31 THEN 'TRENTE ET UN'
WHEN @I BETWEEN 32 AND 39 THEN 'TRENTE-' + dbo.FN_NEC_20(CAST(@U ASINTEGER))
WHEN @I = 40 THEN 'QUARANTE'
WHEN @I = 41 THEN 'QUARANTE ET UN'
WHEN @I BETWEEN 42 AND 39 THEN 'QUARANTE-' + dbo.FN_NEC_20(CAST(@U ASINTEGER))
WHEN @I = 50 THEN 'CINQUANTE'
WHEN @I = 51 THEN 'CINQUANTE ET UN'
WHEN @I BETWEEN 52 AND 59 THEN 'CINQUANTE-' + dbo.FN_NEC_20(CAST(@U ASINTEGER))
WHEN @I = 60 THEN 'SOIXANTE'
WHEN @I = 61 THEN 'SOIXANTE ET UN'
WHEN @I BETWEEN 62 AND 69 THEN 'SOIXANTE-' + dbo.FN_NEC_20(CAST(@U ASINTEGER))
WHEN @I = 70 THEN 'SOIXANTE-DIX'
WHEN @I = 71 THEN 'SOIXANTE ET ONZE'
WHEN @I BETWEEN 72 AND 79 THEN 'SOIXANTE-' + dbo.FN_NEC_20(CAST(@U ASINTEGER)+10)
WHEN @I = 80 THEN 'QUATRE-VINGT'
WHEN @I BETWEEN 81 AND 89 THEN 'QUATRE-VINGT-' + dbo.FN_NEC_20(CAST(@U ASINTEGER))
WHEN @I BETWEEN 90 AND 99 THEN 'QUATRE-VINGT-' + dbo.FN_NEC_20(CAST(@U ASINTEGER)+10)
END
RETURN @RETVAL
ENDGOCREATE FUNCTION FN_NEC_0_100 (@I INT)
RETURNSVARCHAR(256)
AS
/******************************************************************************
* Frédéric BROUARD - Sté DATA SAPIENS - 2004-08-07 *
* Sous procédure de transformation des nombres de 0 à 100 en littéraux *
******************************************************************************/
BEGINIF @I = 0 RETURN 'ZÉRO'
IF @I BETWEEN 1 AND 19 RETURN dbo.FN_NEC_20 (@I)
IF @I BETWEEN 20 AND 99 RETURN dbo.FN_NEC_100 (@I)
IF @I = 100 RETURN 'CENT'
RETURN ''
ENDGOCREATE FUNCTION FN_NOMBRE_EN_CHIFFRE (@I INTEGER)
RETURNSVARCHAR(256)
AS
/******************************************************************************
* Frédéric BROUARD - Sté DATA SAPIENS - 2004-08-07 *
* Fonction de transformation des nombres de 0 à 2 147 483 647 en littéraux *
******************************************************************************/
BEGINIF @I ISNULL RETURN NULLDECLARE @SIGN VARCHAR(5)
IF @I < 0
BEGINSET @SIGN = 'MOINS'
SET @I = -1 * @I
ENDIF @I BETWEEN 0 AND 100 RETURN COALESCE(@SIGN + ' ', '') + dbo.FN_NEC_0_100 (@I)
-- le nombre est supérieur à 100DECLARE @ISVARCHAR(10)
SET @IS = CAST(@I ASVARCHAR(10))
WHILE LEN(@IS) < 10
SET @IS = '0'+@ISDECLARE @D11 INT -- chiffres des unité et dizaineDECLARE @D100 INT -- chiffre des centainesDECLARE @D1000 INT -- chiffre des milliersDECLARE @D10000 INT -- chiffre des dix-milliersDECLARE @D100000 INT -- chiffre des cent-milliersDECLARE @D1000000 INT -- chiffre des millionsDECLARE @D10000000 INT -- chiffre des dix-millionsDECLARE @D100000000 INT -- chiffre des cent-millionsDECLARE @D1000000000 INT -- chiffre des milliardsSET @D11 = CAST(SUBSTRING(@IS, 9, 2) ASINTEGER)
SET @D100 = CAST(SUBSTRING(@IS, 8, 1) ASINTEGER)
SET @D1000 = CAST(SUBSTRING(@IS, 7, 1) ASINTEGER)
SET @D10000 = CAST(SUBSTRING(@IS, 6, 1) ASINTEGER)
SET @D100000 = CAST(SUBSTRING(@IS, 5, 1) ASINTEGER)
SET @D1000000 = CAST(SUBSTRING(@IS, 4, 1) ASINTEGER)
SET @D10000000 = CAST(SUBSTRING(@IS, 3, 1) ASINTEGER)
SET @D100000000 = CAST(SUBSTRING(@IS, 2, 1) ASINTEGER)
SET @D1000000000 = CAST(SUBSTRING(@IS, 1, 1) ASINTEGER)
DECLARE @RETVAL VARCHAR(256)
SET @RETVAL = ''
-- traitement des milliardsIF @D1000000000 <> 0
SET @RETVAL = @RETVAL + dbo.FN_NEC_20 (@D1000000000)+' MILLIARD'
-- traitement des millionsIF @D100000000 = 1
SET @RETVAL = @RETVAL + ' CENT'
IF @D100000000 > 1
SET @RETVAL = @RETVAL + ' ' + dbo.FN_NEC_20 (@D100000000) + ' CENT'
-- exception de l's à la centaine pureIF @D100000000 > 1 AND @D10000000 + @D1000000 = 0
SET @RETVAL = @RETVAL + 'S'
IF @D10000000 * 10 + @D1000000 <> 0
SET @RETVAL = @RETVAL + ' ' + dbo.FN_NEC_0_100 (@D10000000 * 10 + @D1000000)
IF @D100000000 * 100 + @D10000000 * 10 + @D1000000 <> 0
SET @RETVAL = @RETVAL + ' MILLION'
-- traitement des milliersIF @D100000 = 1
SET @RETVAL = @RETVAL + ' CENT'
IF @D100000 > 1
SET @RETVAL = @RETVAL + ' ' + dbo.FN_NEC_20 (@D100000) + ' CENT'
-- exception de l's à la centaine pureIF @D100000 > 1 AND @D10000 = 0 AND @D1000 = 0
SET @RETVAL = @RETVAL + 'S'
IF @D10000 * 10 + @D1000 <> 0
SET @RETVAL = @RETVAL + ' ' + dbo.FN_NEC_0_100 (@D10000 * 10 + @D1000)
IF @D100000 * 100 + @D10000 * 10 + @D1000 <> 0
SET @RETVAL = ' ' + @RETVAL + ' MILLE'
-- traitement des centainesIF @D100 > 1
SET @RETVAL = @RETVAL + ' ' + dbo.FN_NEC_20 (@D100)
IF @D100 > 0
SET @RETVAL = @RETVAL + ' CENT'
-- exception de l's à la centaine pureIF @D100 > 1 AND @D11 = 0
SET @RETVAL = @RETVAL + 'S'
IF @D11 <> 0
SET @RETVAL = @RETVAL + ' ' + dbo.FN_NEC_0_100(@D11)
RETURN COALESCE(@SIGN + ' ', '') + LTRIM(@RETVAL)
ENDGO-- exemple d'utilisationSELECT dbo.FN_NOMBRE_EN_CHIFFRE(-2111623500) AS NOMBRE_EN_LETTRE
CREATE FUNCTION FN_STORAGE_SIZE_KB (@TABLE_NAME VARCHAR(128), @NATURE CHAR(1))
RETURNS BIGINT
AS
/******************************************************************************
Obtention de la taille des informations stockées pour une table spécifique
*******************************************************************************
Frédéric BROUARD - data sapiens - 2004-08-11
*******************************************************************************
ATTENTION, ces données sont basées sur les informations contenues dans les
tables systèmes de descriptions des fichiers. Ces tables ne sont pas
forcément toujours à jour au moment de l'exécution de la fonction.
Pour s'assurer de l'exactitude des informations, veuillez procéder
préalablement à l'exécution de la commande DBCC UPDATEUSAGE pour la table
spécifiée
*******************************************************************************
FONCTIONNEMENT : (exemples)
1) SELECT dbo.FN_STORAGE_SIZE_KB ('MaTable', 'I')
=> donne le cout de stockage en kilo octets des index de la table
MaTable
2) SELECT dbo.FN_STORAGE_SIZE_KB ('MaTable', 'D')
=> donne le cout de stockage en kilo octets des données de la table
MaTable
3) SELECT dbo.FN_STORAGE_SIZE_KB ('MaTable', '')
=> donne le cout de stockage en kilo octets des données et index de la
table MaTable
******************************************************************************/
BEGINIF @TABLE_NAME ISNULL
RETURN NULLIFNOTEXISTS(SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = @TABLE_NAME
AND TABLE_TYPE = 'BASE TABLE')
RETURN NULLDECLARE @id INT
declare @DATA_SIZE BIGINT
declare @INDX_SIZE BIGINT
SELECT @id = id
FROM sysobjects
WHEREname = @TABLE_NAME
IF @id ISNULL
RETURN NULLSET @DATA_SIZE = 0
SET @INDX_SIZE = 0
-- la taille des données d'un objet set @DATA_SIZE = (SELECTSUM(dpages)
FROM sysindexes
WHERE indid < 2
AND id = @id)
+ (SELECT COALESCE(sum(used), 0)
FROM sysindexes
WHERE indid = 255
AND id = @id)
-- la taille des index d'un objetset @INDX_SIZE = (SELECTsum(used)
FROM sysindexes
WHERE indid in (0, 1, 255)
AND id = @id)
- @DATA_SIZE
IF @NATURE = 'I' SET @DATA_SIZE = 0
IF @NATURE = 'D' SET @INDX_SIZE = 0
-- cooroboration avec les unités de mesure physique de stockage du systèmeSELECT @DATA_SIZE = (@DATA_SIZE + @INDX_SIZE) * low / 1024.0
FROM master.dbo.spt_values
WHEREnumber = 1
AND type = 'E'
RETURN @DATA_SIZE
ENDGO
CREATE FUNCTION FN_DROP_CHARS (@DATA VARCHAR(128), @CHARS_TO_DROP VARCHAR(220))
RETURNSVARCHAR(128)
AS
/******************************************************************************
Suppression de caractères dans une chaine de caractères
*******************************************************************************
Frédéric BROUARD - data sapiens - 2004-08-11
*******************************************************************************
La fonction FN_DROP_CHARS supprime tous les caractères contenus dans la
chaine de caractères @CHARS_TO_DROP au sein de la chaine @DATA.
Exemple : SELECT dbo.FN_DROP_CHARS('Locomotive', 'lot')
=> Lcmive
******************************************************************************/
BEGINIF @DATA ISNULLOR @CHARS_TO_DROP ISNULL
RETURN NULLIF @DATA = ''
RETURN ''
IF @CHARS_TO_DROP = ''
RETURN @DATA
DECLARE @NEW_DATA VARCHAR(128)
SET @NEW_DATA = ''
DECLARE @I INT
SET @I = 1
DECLARE @C CHAR(1)
WHILE @I <= LEN(@DATA)
BEGINSET @C = SUBSTRING(@DATA, @I, 1)
IF CHARINDEX(@C, @CHARS_TO_DROP) = 0
SET @NEW_DATA = @NEW_DATA + @C
SET @I = @I +1
END
RETURN @NEW_DATA
ENDGO
CREATEVIEW V_DATEHEURE_COURANTE
ASSELECT CURRENT_TIMESTAMP AS DATEHEURE_COURANTE
GOCREATE FUNCTION FN_DATE_HEURE_FORMAT_COMPACT ()
RETURNS CHAR(16)
AS
/******************************************************************************
Obtention d'une dateheure au format compact AAAAMMJJHHMMSS
*******************************************************************************
Frédéric BROUARD - data sapiens - 2004-08-11
*******************************************************************************
NOTA : cette fonction est basée sur la vue V_DATEHEURE_COURANTE implémentée
ci dessus.
******************************************************************************/
BEGINDECLARE @DH CHAR(16)
SELECT @DH = CONVERT(CHAR(8), DATEHEURE_COURANTE, 112)
+ REPLACE(CONVERT(CHAR(8), DATEHEURE_COURANTE, 108), ':', '')
FROM V_DATEHEURE_COURANTE
RETURN @DH
ENDGO