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
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Fred BROUARD
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
?
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
-- 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
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" a écrit dans le message de 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
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" <a@bc.de> a écrit dans le message de
news:%230wgjL0pKHA.5840@TK2MSFTNGP04.phx.gbl...
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
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" a écrit dans le message de 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
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:
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" wrote in message 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
?
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:
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" <a@bc.de> wrote in message
news:%230wgjL0pKHA.5840@TK2MSFTNGP04.phx.gbl...
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
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:
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" wrote in message 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
Merci à tous, je n'espérais pas avoir autant de réponses !
"Albéric Maspac" a écrit dans le message de 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
?
Merci à tous, je n'espérais pas avoir autant de réponses !
"Albéric Maspac" <a@bc.de> a écrit dans le message de news:
%230wgjL0pKHA.5840@TK2MSFTNGP04.phx.gbl...
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
Merci à tous, je n'espérais pas avoir autant de réponses !
"Albéric Maspac" a écrit dans le message de 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
?
Fred BROUARD
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
?
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
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
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
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
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
sans les " ' " autour du nom de la fonction ! "Albéric Maspac" a écrit dans le message de news:
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
sans les " ' " autour du nom de la fonction !
"Albéric Maspac" <a@bc.de> a écrit dans le message de news:
OGkGjCCqKHA.5328@TK2MSFTNGP04.phx.gbl...
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
sans les " ' " autour du nom de la fonction ! "Albéric Maspac" a écrit dans le message de news:
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
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" wrote:
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
?
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" <a...@bc.de> wrote:
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
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" wrote:
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
On 6 fév, 16:41, "Albéric Maspac" wrote:
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
On 6 fév, 16:41, "Albéric Maspac" <a...@bc.de> wrote:
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)
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
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" wrote in message 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
?
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" <a@bc.de> wrote in message
news:#0wgjL0pKHA.5840@TK2MSFTNGP04.phx.gbl...
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
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" wrote in message 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