Fonction Scalaire spéciale

Le
Albéric Maspac
Bonjour,

Toujours aussi débutant, je cherche à migrer une fonction VBA en TSQL
Et si je suis ici, c'est que je n'y arrive pas !

Principe : l'utilisateur possède un _trousseau_ (un entier long de 32 -1
bits, équivalent à 31 clés) et face à une porte, teste si la _clef_ est dans
le _trousseau_

Par exemple 546 | 5 => Vrai, mais 546 | 6 => Faux

Merci d'avance,

Albéric
«
Function IsClefOk(Trousseau As Long, Clef As Byte) As Boolean

Dim NbreXor As Long
If IsNull(Trousseau) Or IsNull(Clef) Then
IsClefOk = False
Else
NbreXor = Trousseau Xor (2 ^ Clef)
IsClefOk = NbreXor < Trousseau
End If

End Function

?
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Fred BROUARD
Le #21143331
Le principe est de faire :

SELECT 1
WHERE 5 | 5 = 5

Lisez le papier que j'ai écrit à ce sujet :

http://sqlpro.developpez.com/cours/stockageopt/

A +


--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
Enseignant aux Arts & Métiers PACA et à L'ISEN Toulon - Var Technologies
*********************** http://www.sqlspot.com *************************
Albéric Maspac a écrit :
Bonjour,





Toujours aussi débutant, je cherche à migrer une fonction VBA en TSQL
Et si je suis ici, c'est que je n'y arrive pas !

Principe : l'utilisateur possède un _trousseau_ (un entier long de 32 -1
bits, équivalent à 31 clés) et face à une porte, teste si la _clef_ est dans
le _trousseau_

Par exemple 546 | 5 => Vrai, mais 546 | 6 => Faux

Merci d'avance,

Albéric
«
Function IsClefOk(Trousseau As Long, Clef As Byte) As Boolean

Dim NbreXor As Long
If IsNull(Trousseau) Or IsNull(Clef) Then
IsClefOk = False
Else
NbreXor = Trousseau Xor (2 ^ Clef)
IsClefOk = NbreXor < Trousseau
End If

End Function

?




Patrice
Le #21143581
Bonjour,

Peut-être :
SELECT 546 & POWER(2,5)
SELECT 546 & POWER(2,6)

Si le problème est de trouver une fonction voir la doc :
http://msdn.microsoft.com/fr-fr/library/ms174318.aspx

La fonction de départ semble déjà bizarre, généralement on fait simplement
un AND binaire entre les deux valeurs ce qui suffit à voir si le bit indiqué
par l'une des deux valeurs est également à 1 dans l'autre...

--
Patrice


"Albéric Maspac" news:%
Bonjour,

Toujours aussi débutant, je cherche à migrer une fonction VBA en TSQL
Et si je suis ici, c'est que je n'y arrive pas !

Principe : l'utilisateur possède un _trousseau_ (un entier long de 32 -1
bits, équivalent à 31 clés) et face à une porte, teste si la _clef_ est
dans le _trousseau_

Par exemple 546 | 5 => Vrai, mais 546 | 6 => Faux

Merci d'avance,

Albéric
«
Function IsClefOk(Trousseau As Long, Clef As Byte) As Boolean

Dim NbreXor As Long
If IsNull(Trousseau) Or IsNull(Clef) Then
IsClefOk = False
Else
NbreXor = Trousseau Xor (2 ^ Clef)
IsClefOk = NbreXor < Trousseau
End If

End Function

?



Sylvain Lafontaine
Le #21144811
Opérateur Bitwise pour SQL-Server: & = AND, | = OR, ~ = NOT et ^ = XOR.
Pour la fonction puissance, vous avez besoin de la fonction POWER; ce qui
nous donne au final:

select power (2,5), power (2,6)
select 546 ^ power (2,5), 546 ^ power (2,6)

Il y a cependant un problème ici; c'est que les entiers de SQL-Server sont
signés (vous ne pouvez pas avoir un entier non-signé or "unsigned integer");
de sorte que le 32ième bit nous est donc inaccessible:

--> Erreur de calcul ici à cause d'un overflow:
select power (2, 31)

Vous aurez donc à tester directement pour la valeur #31 ou à convertir vos
entiers en BIGINT. (BIGINT: SQL-Server 2005+). Par ailleurs, voici un
article intéressant si comment découper des chaînes Varbinary:

http://www.eggheadcafe.com/software/aspnet/29207417/bitwise-operation-on-bina.aspx

Finalement, ce genre de chose devrait être fait du côté client et non pas du
côté SQL-Server.

--
Sylvain Lafontaine, ing.
MVP pour « Windows Live Platform »
Blogue/site web: http://paparazzi-codeur.sylvainlafontaine.com
Consultant indépendant et programmation à distance pour Access et
SQL-Server.


"Albéric Maspac" news:%
Bonjour,

Toujours aussi débutant, je cherche à migrer une fonction VBA en TSQL
Et si je suis ici, c'est que je n'y arrive pas !

Principe : l'utilisateur possède un _trousseau_ (un entier long de 32 -1
bits, équivalent à 31 clés) et face à une porte, teste si la _clef_ est
dans le _trousseau_

Par exemple 546 | 5 => Vrai, mais 546 | 6 => Faux

Merci d'avance,

Albéric
«
Function IsClefOk(Trousseau As Long, Clef As Byte) As Boolean

Dim NbreXor As Long
If IsNull(Trousseau) Or IsNull(Clef) Then
IsClefOk = False
Else
NbreXor = Trousseau Xor (2 ^ Clef)
IsClefOk = NbreXor < Trousseau
End If

End Function

?



Albéric Maspac
Le #21146891
Merci à tous, je n'espérais pas avoir autant de réponses !

"Albéric Maspac" %
Bonjour,

Toujours aussi débutant, je cherche à migrer une fonction VBA en TSQL
Et si je suis ici, c'est que je n'y arrive pas !

Principe : l'utilisateur possède un _trousseau_ (un entier long de 32 -1
bits, équivalent à 31 clés) et face à une porte, teste si la _clef_ est
dans le _trousseau_

Par exemple 546 | 5 => Vrai, mais 546 | 6 => Faux

Merci d'avance,

Albéric
«
Function IsClefOk(Trousseau As Long, Clef As Byte) As Boolean

Dim NbreXor As Long
If IsNull(Trousseau) Or IsNull(Clef) Then
IsClefOk = False
Else
NbreXor = Trousseau Xor (2 ^ Clef)
IsClefOk = NbreXor < Trousseau
End If

End Function

?



Fred BROUARD
Le #21147451
Lisez l'article que j'ai écrit à ce sujet :
http://sqlpro.developpez.com/cours/stockageopt/

A +


--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
Enseignant aux Arts & Métiers PACA et à L'ISEN Toulon - Var Technologies
*********************** http://www.sqlspot.com *************************

Albéric Maspac a écrit :
Bonjour,

Toujours aussi débutant, je cherche à migrer une fonction VBA en TSQL
Et si je suis ici, c'est que je n'y arrive pas !

Principe : l'utilisateur possède un _trousseau_ (un entier long de 32 -1
bits, équivalent à 31 clés) et face à une porte, teste si la _clef_ est dans
le _trousseau_

Par exemple 546 | 5 => Vrai, mais 546 | 6 => Faux

Merci d'avance,

Albéric
«
Function IsClefOk(Trousseau As Long, Clef As Byte) As Boolean

Dim NbreXor As Long
If IsNull(Trousseau) Or IsNull(Clef) Then
IsClefOk = False
Else
NbreXor = Trousseau Xor (2 ^ Clef)
IsClefOk = NbreXor < Trousseau
End If

End Function

?




Albéric Maspac
Le #21149041
Bonjour et encore merci,

Voici le résultat de la quintessence de vos réponses:

CREATE FUNCTION 'F_IsBitOk'
(
@GroupeBits as INT,
@Pos as TINYINT
)
RETURNS BIT
AS
BEGIN
RETURN (select case when @GroupeBits & power(2,@Pos) = power(2,@Pos)
then 1 else 0 end )
END
Albéric Maspac
Le #21149091
sans les " ' " autour du nom de la fonction !
"Albéric Maspac"
Bonjour et encore merci,

Voici le résultat de la quintessence de vos réponses:

CREATE FUNCTION 'F_IsBitOk'
(
@GroupeBits as INT,
@Pos as TINYINT
)
RETURNS BIT
AS
BEGIN
RETURN (select case when @GroupeBits & power(2,@Pos) = power(2,@Pos)
then 1 else 0 end )
END



SQLpro
Le #21151721
Bonjour,

lisez l'article que j'ai écrit à ce sujet :
http://sqlpro.developpez.com/cours/stockageopt/

A +

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage
SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning,
optimisation
Enseignant aux Arts & Métiers PACA et à L'ISEN Toulon - Var
Technologies
*********************** http://www.sqlspot.com
*************************

On 6 fév, 16:41, "Albéric Maspac"
Bonjour,

Toujours aussi débutant, je cherche à migrer une fonction VBA en TSQL
Et si je suis ici, c'est que je n'y arrive pas !

Principe : l'utilisateur possède un _trousseau_ (un entier long de 32 - 1
bits, équivalent à 31 clés) et face à une porte, teste si la _cle f_ est dans
le _trousseau_

Par exemple 546 | 5 => Vrai, mais 546 | 6 => Faux

Merci d'avance,

Albéric
«
Function IsClefOk(Trousseau As Long, Clef As Byte) As Boolean

    Dim NbreXor          As Long
    If IsNull(Trousseau) Or IsNull(Clef) Then
        IsClefOk = False
    Else
        NbreXor = Trousseau Xor (2 ^ Clef)
        IsClefOk = NbreXor < Trousseau
    End If

End Function

?


zoltix
Le #21152541
On 6 fév, 16:41, "Albéric Maspac"
Bonjour,

Toujours aussi débutant, je cherche à migrer une fonction VBA en TSQL
Et si je suis ici, c'est que je n'y arrive pas !

Principe : l'utilisateur possède un _trousseau_ (un entier long de 32 - 1
bits, équivalent à 31 clés) et face à une porte, teste si la _cle f_ est dans
le _trousseau_

Par exemple 546 | 5 => Vrai, mais 546 | 6 => Faux

Merci d'avance,

Albéric
«
Function IsClefOk(Trousseau As Long, Clef As Byte) As Boolean

    Dim NbreXor          As Long
    If IsNull(Trousseau) Or IsNull(Clef) Then
        IsClefOk = False
    Else
        NbreXor = Trousseau Xor (2 ^ Clef)
        IsClefOk = NbreXor < Trousseau
    End If

End Function

?


Si j'ai bien compris c'est un masque de bit ?

Va voir
http://www.sqlservercentral.com/scripts/T-SQL/61457/


--------------------------------------------------------------------------- --------
-- Check if bigint Bit is ON
--------------------------------------------------------------------------- --------
CREATE FUNCTION dbo.fnBitIsOn (@BitMap BIGINT, @BitNo TINYINT = 0)
RETURNS TINYINT
-- v1.0.0 2006.09.26, Ofer Bester
AS BEGIN
IF (@BitNo > 63)
RETURN 0

IF (@BitNo = 63)
BEGIN
IF (@BitMap >= 0)
RETURN 0
ELSE
RETURN 1
END

IF ( @BitMap & POWER( CAST(2 AS BIGINT), @BitNo ) ) <> 0
RETURN 1

RETURN 0
END
GO

--------------------------------------------------------------------------- --------
-- Set bigint Bit OFF
--------------------------------------------------------------------------- --------
CREATE FUNCTION dbo.fnBitSetOff (@BitMap BIGINT, @BitNo TINYINT = 0)
RETURNS BIGINT
-- v1.0.0 2006.09.26, Ofer Bester
AS BEGIN
IF (@BitNo > 63)
RETURN @BitMap

IF (@BitNo = 63)
RETURN @BitMap & 0x7FFFFFFFFFFFFFFF

RETURN (@BitMap & ~POWER( CAST(2 AS BIGINT), @BitNo )) -- Set bit #
@BitNo OFF
END
GO

--------------------------------------------------------------------------- --------
-- Set bigint Bit ON
--------------------------------------------------------------------------- --------
CREATE FUNCTION dbo.fnBitSetOn (@BitMap BIGINT, @BitNo TINYINT = 0)
RETURNS BIGINT
-- v1.0.0 2006.09.26, Ofer Bester
AS BEGIN
IF (@BitNo > 63)
RETURN @BitMap

IF (@BitNo = 63)
RETURN @BitMap | 0x8000000000000000

RETURN (@BitMap | POWER( CAST(2 AS BIGINT), @BitNo )) -- Set bit #
@BitNo ON
END
GO

--------------------------------------------------------------------------- --------
-- Toggle bigint Bit ON/OFF
--------------------------------------------------------------------------- --------
CREATE FUNCTION dbo.fnBitToggle (@BitMap BIGINT, @BitNo TINYINT = 0)
RETURNS BIGINT
-- v1.0.0 2006.09.26, Ofer Bester
AS BEGIN
IF ( dbo.fnBitIsOn(@BitMap, @BitNo) = 1 )
RETURN dbo.fnBitSetOff(@BitMap, @BitNo)

RETURN dbo.fnBitSetOn(@BitMap, @BitNo)
END
Med Bouchenafa
Le #21154111
Il faut faire pareil en T-SQL et ecrire une fonction qui utilise les
operateurs BITWISE

CREATE FUNCTION IsClefOk( @Trousseau INT, @Clef As TINYINT )
RETURNS BIT
AS
BEGIN
DECLARE @NbreXor int
DECLARE @ReturnValue BIT

IF ( (@Trousseau = NULL) OR ( @Clef = NULL) )
RETURN 0

RETURN @Trousseau & @Clef

END


Exemple
SELECT dbo.IsClefOk( 6, 1 )


Bien cordialement
Med Bouchenafa


"Albéric Maspac" news:#
Bonjour,

Toujours aussi débutant, je cherche à migrer une fonction VBA en TSQL
Et si je suis ici, c'est que je n'y arrive pas !

Principe : l'utilisateur possède un _trousseau_ (un entier long de 32 -1
bits, équivalent à 31 clés) et face à une porte, teste si la _clef_ est
dans le _trousseau_

Par exemple 546 | 5 => Vrai, mais 546 | 6 => Faux

Merci d'avance,

Albéric
«
Function IsClefOk(Trousseau As Long, Clef As Byte) As Boolean

Dim NbreXor As Long
If IsNull(Trousseau) Or IsNull(Clef) Then
IsClefOk = False
Else
NbreXor = Trousseau Xor (2 ^ Clef)
IsClefOk = NbreXor < Trousseau
End If

End Function

?



Publicité
Poster une réponse
Anonyme