Un petit cocktail de fonction (UDF) pour SQL Server…
1 – Fonction retournant la semaine courante
CREATE FUNCTION F_SEMAINE(@DT DATETIME)
RETURNS @T TABLE (JOUR_DATE DATETIME,
JOUR_NOM VARCHAR(8))
AS
BEGIN
WHILE DATEPART(weekday, @DT) <> 1
SET @DT = DATEADD(DAY, -1, @DT);
SET @DT = CAST(FLOOR(CAST(@DT AS FLOAT)) AS DATETIME);
INSERT @T SELECT @DT, 'Lundi';
INSERT @T SELECT DATEADD(DAY, 1, @DT), 'Mardi';
INSERT @T SELECT DATEADD(DAY, 2, @DT), 'Mercredi';
INSERT @T SELECT DATEADD(DAY, 3, @DT), 'Jeudi';
INSERT @T SELECT DATEADD(DAY, 4, @DT), 'Vendredi';
INSERT @T SELECT DATEADD(DAY, 5, @DT), 'Samedi';
INSERT @T SELECT DATEADD(DAY, 6, @DT), 'Dimanche';
RETURN;
END
GO
2 – Fonctions Max et Min de deux paramètres
-- max de deux paramètres
CREATE FUNCTION dbo.F_MAX2 (@DATA1 sql_variant, @DATA2 sql_variant)
RETURNS sql_variant
AS
BEGIN
RETURN CASE WHEN @DATA1 > @DATA2 THEN @DATA1 ELSE @DATA2 END
END
GO
-- min de deux paramètres
CREATE FUNCTION dbo.F_MIN2 (@DATA1 sql_variant, @DATA2 sql_variant)
RETURNS sql_variant
AS
BEGIN
RETURN CASE WHEN @DATA1 < @DATA2 THEN @DATA1 ELSE @DATA2 END
END
GO
3 – Procédure de recherche d’un mot (motif) dans toutes les colonnes d’une table
CREATE PROCEDURE dbo.P_SEARCH_ALL_COLS
@NOM_TABLE VARCHAR(128), -- nom de table
@NOM_SCHEMA VARCHAR(128) = 'dbo', -- nom de schéma
@MOT VARCHAR(256) -- mot recherché
AS
DECLARE @SQL VARCHAR(max) -- requête de recherche
SET @SQL = 'SELECT * FROM [' + @NOM_TABLE + '].[' + @NOM_TABLE + '] WHERE '
-- obtention de la liste des colonnes de la table concernée
SELECT @SQL = @SQL + COLUMN_NAME +' LIKE ''%'
+ @MOT +'%'' COLLATE French_CI_AI OR '
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @NOM_TABLE
AND TABLE_SCHEMA = @NOM_SCHEMA
AND DATA_TYPE LIKE '%char%'
SET @SQL = SUBSTRING(@SQL, 1, LEN(@SQL) - 3)
-- exécution de la requête de recherche
EXEC (@SQL)
GO
4 – découper une chaine de caractères en de multiples nombres
CREATE FUNCTION F_T_NOMBRES (@DATA VARCHAR(max))
RETURNS @T TABLE (NOMBRE VARCHAR(64))
AS
BEGIN
IF @DATA IS NULL RETURN
IF LEN(@DATA) = 0 RETURN
DECLARE @I INT, @C CHAR(1), @A VARCHAR(64)
SELECT @I = 1, @A = ''
WHILE @I < LEN(@DATA)
BEGIN
SET @C = SUBSTRING(@DATA, @I, 1)
IF @C IN ('0', '1', '2', '3', '4', '5', '6', '7', '8','9', '.', '-')
IF @C = '-' AND LEN(@DATA) > 0
BEGIN
IF LEN(@A) > 0
BEGIN
INSERT INTO @T VALUES (@A)--(CAST(@A AS FLOAT))
SET @A = @C
END
END
ELSE
SET @A = @A + @C
ELSE
BEGIN
IF LEN(@A) > 0
BEGIN
INSERT INTO @T VALUES (@A)--(CAST(@A AS FLOAT))
SET @A = ''
END
END
SET @I = @I + 1
END
RETURN
END
GO
Exemple:
FROM dbo.F_T_NOMBRES ('-10-20+30-40-50+60')
qui donne :
NOMBRE
----------------------------------------------------------------
10
-20
30
-40
-50
5 – extrait le nom ou le chemin d’un fichier
CREATE FUNCTION dbo.F_EXTRACT_FILE_PART (@FILE NVARCHAR(max), @PART CHAR(4))
RETURNS NVARCHAR(max)
AS
BEGIN
RETURN CASE
WHEN @PART = 'PATH' COLLATE French_CI_AI THEN LEFT(@FILE, LEN(@FILE) - CHARINDEX('\', REVERSE(@FILE)) + 1)
WHEN @PART = 'NAME' COLLATE French_CI_AI THEN RIGHT(@FILE, CHARINDEX('\', REVERSE(@FILE)) - 1)
END
END
GO
6 – formate un mauvais identifiant SQL en un identifiant SQL normatif
CREATE FUNCTION F_CLEAN_SQLID(@SQL_ID NVARCHAR(128))
RETURNS NVARCHAR(128)
AS
BEGIN
IF @SQL_ID IS NULL RETURN NULL;
IF @SQL_ID ='' RETURN '';
DECLARE @I INT, @C NCHAR(1), @RETVAL NVARCHAR(128);
SELECT @I = 1, @RETVAL = '';
WHILE @I <= LEN(@SQL_ID)
BEGIN
SET @C = SUBSTRING (@SQL_ID, @I, 1);
IF @C COLLATE French_CS_AS BETWEEN 'A' AND 'Z'
OR @C COLLATE French_CS_AS BETWEEN 'a' AND 'z'
OOR (@C BETWEEN '0' AND '9' AND @I > 1)
OR @C = '_'
SET @RETVAL = @RETVAL + @C;
ELSE SET @RETVAL = @RETVAL + '_';
SET @I = @I + 1;
END
RETURN @RETVAL;
END
Exemple :
SELECT dbo.F_CLEAN_SQLID('9Ma table 123 !')
Résultat :
_Ma_table_123__
***
Frédéric BROUARD – SQLpro – MVP SQL Server
Spécialiste SQL/BD modélisation de données
SQL & SGBDR http://sqlpro.developpez.com/
Expert SQL Server : http://www.sqlspot.com
audits – optimisation – tuning – formation