Voici deux petites fonction de manipulations de chaines binaires : l’une transforme en chaine de bits un décimal et l’autre compte le nombre de 1 d’une chaine binaire.
1 – transformation d’entier en chaine binaire
IF EXISTS(SELECT *
FROM sys.objects
WHERE type_desc = 'SQL_SCALAR_FUNCTION'
AND name = 'F_DEC_TO_BIN'
AND schema_id = SCHEMA_ID('dbo')
EXEC ('DROP FUNCTION dbo.F_DEC_TO_BIN');
GO
CREATE FUNCTION dbo.F_DEC_TO_BIN (@N BIGINT)
RETURNS VARCHAR(256)
AS
/*******************************************************************************
* Fred Brouard / SQLpro - 2011-09-15 - sqlpro.developpez.com - www.sqlspot.com *
********************************************************************************
* FONCTION dbo.F_DEC_TO_BIN : transforme un nombre décimal entier en chaine de *
* bits (chaine composée de zéros et de uns) *
* PARAMETRES en sortie : chaîne de caractères ASCII longeur maximal 256 *
* en entrée : 1) @N grand entier *
********************************************************************************
* Exemple : SELECT dbo.F_DEC_TO_BIN(12345) => 11000000111001 *
*******************************************************************************/
BEGIN
DECLARE @BIN VARCHAR(256);
SET @BIN = '';
WHILE @N > 1
BEGIN
IF @N % 2 = 0
SET @BIN = '0' + @BIN
ELSE
SET @BIN = '1' + @BIN
SET @N = @N / 2;
END;
RETURN CAST(@N AS CHAR(1)) + @BIN
END
GO
2 – comptage du nombre de zéros d’une chaine de bits
IF EXISTS(SELECT *
FROM sys.objects
WHERE type_desc = 'SQL_SCALAR_FUNCTION'
AND name = 'F_COUNT_BIN_ONE'
AND schema_id = SCHEMA_ID('dbo')
EXEC ('DROP FUNCTION dbo.F_COUNT_BIN_ONE');
GO
CREATE FUNCTION dbo.F_COUNT_BIN_ONE (@BIN VARCHAR(256))
RETURNS TINYINT
AS
/*******************************************************************************
* Fred Brouard / SQLpro - 2011-09-15 - sqlpro.developpez.com - www.sqlspot.com *
********************************************************************************
* FONCTION dbo.F_COUNT_BIN_ONE : compte le nombre de 1 dans une chaine de bits *
* (chaine composée de zéros et de uns) *
* PARAMETRES en sortie : entier "TINYINT" *
* en entrée : 1) @BIN chaîne de caractères longeur maximale 256 *
* NOTA : en cas d'erreur dans la chaine (caractère autres que zéro et un) la *
* fonction renvoie NULL *
********************************************************************************
* Exemple : SELECT dbo.F_COUNT_BIN_ONE('11000000111001') => 6 *
*******************************************************************************/
BEGIN
DECLARE @I SMALLINT, @NB TINYINT;
SELECT @I = 1, @NB = 0;
WHILE @I <= LEN(@BIN)
BEGIN
IF SUBSTRING(@BIN, @I, 1) NOT IN ('0', '1')
RETURN NULL
SET @NB = @NB + CAST(SUBSTRING(@BIN, @I, 1) AS TINYINT);
SET @I = @I + 1
END;
RETURN @NB;
END;
GO
Exemple d’utilisation :
SELECT dbo.F_DEC_TO_BIN(12345) => 11000000111001
SELECT dbo.F_COUNT_BIN_ONE(dbo.F_DEC_TO_BIN(12345)) => 6
SELECT dbo.F_COUNT_BIN_ONE(dbo.F_DEC_TO_BIN(12345)) => 6
--------
Frédéric Brouard, SQLpro - ARCHITECTE DE DONNÉES, http://sqlpro.developpez.com/
Expert bases de données relationnelles et langage SQL. MVP Microsoft SQL Server
www.sqlspot.com : modélisation, conseil, audit, optimisation, tuning, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *