IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Bug incompréhensible avec datetime2fromparts() [2016]


Sujet :

Développement SQL Server

  1. #1
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 152
    Points : 7 402
    Points
    7 402
    Billets dans le blog
    1
    Par défaut Bug incompréhensible avec datetime2fromparts()
    Bonjour,

    J'ai une table dans laquelle est stockée une date dans une colonne bigint, au format yyyyMMddHHmmssfff

    C'est à dire que pour la valeur 20190902175825478 cela correspond au 2 septembre 2019 à 17h58 et 25 secondes 478 millièmes.

    Je tente d'utiliser datetime2fromparts pour convertir cette colonne en datetime2.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select 
    	MA.Datum_DT,
    	datetime2fromparts(cast(MA.Datum_DT / 10000000000000 as bigint), cast(MA.Datum_DT / 100000000000 as bigint) % 100, cast(MA.Datum_DT / 1000000000 as bigint) % 100, cast(MA.Datum_DT / 10000000 as bigint) % 100, cast(MA.Datum_DT / 100000 as bigint) % 100, cast(MA.Datum_DT / 1000 as bigint) % 100, MA.Datum_DT % 1000, 3)
    from matable

    J'obtiens cette erreur :
    Msg*289, Niveau*16, État*5, Ligne*153
    Impossible de construire le type de données datetime2, car certains des arguments ont des valeurs qui ne sont pas valides.
    Pourtant, si je décompose les colonnes sans tenter de convertir les données, je je trouve aucune valeur incohérente…
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    select
    	MA.Datum_DT,
    	cast(MA.Datum_DT / 10000000000000 as bigint) yyyy, 
    	cast(MA.Datum_DT / 100000000000 as bigint) % 100 MM, 
    	cast(MA.Datum_DT / 1000000000 as bigint) % 100 dd, 
    	cast(MA.Datum_DT / 10000000 as bigint) % 100 HH, 
    	cast(MA.Datum_DT / 100000 as bigint) % 100 mm, 
    	cast(MA.Datum_DT / 1000 as bigint) % 100 ss, 
    	MA.Datum_DT % 1000 fff
    from matable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Datum_DT             yyyy                 MM                   dd                   HH                   mm                   ss                   fff
    -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- --------------------
    20190812160000000    2019                 8                    12                   16                   0                    0                    0
    20190814080000000    2019                 8                    14                   8                    0                    0                    0
    20190814140000000    2019                 8                    14                   14                   0                    0                    0
    20190814150000000    2019                 8                    14                   15                   0                    0                    0
    20190814160000000    2019                 8                    14                   16                   0                    0                    0
    20190814160000000    2019                 8                    14                   16                   0                    0                    0
    20190816100000000    2019                 8                    16                   10                   0                    0                    0
     
    (7 lignes affectées)
    Qu'est-ce que j'ai mal fait ???
    On ne jouit bien que de ce qu’on partage.

  2. #2
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 152
    Points : 7 402
    Points
    7 402
    Billets dans le blog
    1
    Par défaut
    Je n'y comprends vraiment rien…

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    with MA (Datum_DT)
    as
    (
    	select cast(20190812160000000 as bigint)
    	union all
    	select cast(20190814080000000 as bigint)
    	union all
    	select cast(20190814140000000 as bigint)
    	union all
    	select cast(20190814150000000 as bigint)
    	union all
    	select cast(20190814160000000 as bigint)
    	union all
    	select cast(20190814160000000 as bigint)
    	union all
    	select cast(20190816100000000 as bigint)
    )
    select
    	MA.Datum_DT,
    	datetime2fromparts(cast(MA.Datum_DT / 10000000000000 as bigint), cast(MA.Datum_DT / 100000000000 as bigint) % 100, cast(MA.Datum_DT / 1000000000 as bigint) % 100, cast(MA.Datum_DT / 10000000 as bigint) % 100, cast(MA.Datum_DT / 100000 as bigint) % 100, cast(MA.Datum_DT / 1000 as bigint) % 100, MA.Datum_DT % 1000, 3),
    	cast(MA.Datum_DT / 10000000000000 as bigint) yyyy, 
    	cast(MA.Datum_DT / 100000000000 as bigint) % 100 MM, 
    	cast(MA.Datum_DT / 1000000000 as bigint) % 100 dd, 
    	cast(MA.Datum_DT / 10000000 as bigint) % 100 HH, 
    	cast(MA.Datum_DT / 100000 as bigint) % 100 mm, 
    	cast(MA.Datum_DT / 1000 as bigint) % 100 ss, 
    	MA.Datum_DT % 1000 fff
    from MA;
    Je repars donc des mêmes données que celles dans ma table.
    Et pourtant ça marche !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    20190812160000000	2019-08-12 16:00:00.000	2019	8	12	16	0	0	0
    20190814080000000	2019-08-14 08:00:00.000	2019	8	14	8	0	0	0
    20190814140000000	2019-08-14 14:00:00.000	2019	8	14	14	0	0	0
    20190814150000000	2019-08-14 15:00:00.000	2019	8	14	15	0	0	0
    20190814160000000	2019-08-14 16:00:00.000	2019	8	14	16	0	0	0
    20190814160000000	2019-08-14 16:00:00.000	2019	8	14	16	0	0	0
    20190816100000000	2019-08-16 10:00:00.000	2019	8	16	10	0	0	0
    On ne jouit bien que de ce qu’on partage.

  3. #3
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 152
    Points : 7 402
    Points
    7 402
    Billets dans le blog
    1
    Par défaut
    Ca y est, je viens de comprendre…

    Ben l'optimiseur de SQL Server, il a encore du boulot hein…

    Pour faire simple, voici ma requête :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
    /* Activités liées */
    with wr (id, monday, sunday, lastmonday, nextsunday)
    as
    (
    	select
    		MA.ID,
    		CAST(FORMAT(DATEADD(week, DATEDIFF(week, 0, datetime2fromparts(MA.Datum_DT / 10000000000000, (MA.Datum_DT / 100000000000) % 100, (MA.Datum_DT / 1000000000) % 100, (MA.Datum_DT / 10000000) % 100, (MA.Datum_DT / 100000) % 100, (MA.Datum_DT / 1000) % 100, MA.Datum_DT % 1000, 3)), 0), 'yyyyMMddHHmmssfff') as bigint),
    		CAST(FORMAT(DATEADD(second, -1, DATEADD(week, DATEDIFF(week, 0, datetime2fromparts(MA.Datum_DT / 10000000000000, (MA.Datum_DT / 100000000000) % 100, (MA.Datum_DT / 1000000000) % 100, (MA.Datum_DT / 10000000) % 100, (MA.Datum_DT / 100000) % 100, (MA.Datum_DT / 1000) % 100, MA.Datum_DT % 1000, 3)) + 1, 0)), 'yyyyMMddHHmmssfff') as bigint),
    		CAST(FORMAT(DATEADD(week, DATEDIFF(week, 0, datetime2fromparts(MA.Datum_DT / 10000000000000, (MA.Datum_DT / 100000000000) % 100, (MA.Datum_DT / 1000000000) % 100, (MA.Datum_DT / 10000000) % 100, (MA.Datum_DT / 100000) % 100, (MA.Datum_DT / 1000) % 100, MA.Datum_DT % 1000, 3)) - 1, 0), 'yyyyMMddHHmmssfff') as bigint),
    		CAST(FORMAT(DATEADD(second, -1, DATEADD(week, DATEDIFF(week, 0, datetime2fromparts(MA.Datum_DT / 10000000000000, (MA.Datum_DT / 100000000000) % 100, (MA.Datum_DT / 1000000000) % 100, (MA.Datum_DT / 10000000) % 100, (MA.Datum_DT / 100000) % 100, (MA.Datum_DT / 1000) % 100, MA.Datum_DT % 1000, 3)) + 2, 0)), 'yyyyMMddHHmmssfff') as bigint)
    	from TE_ISI_MA MA
    	where MA.ID = 0x00002329001d9c92
    ),
    IDCP (ID, ID_FI, ID_PE)
    as
    (
    	select ID, ID_FI, ID_PE
    	from TE_ISI_CP cp
    	where cp.LosKZ = 0
    	and cp.ID = 4295017575
    )
    select
    	case
    		when ma.Datum_DT < wr.monday then 1
    		when ma.Datum_DT between wr.monday and wr.sunday then 2
    		else 3
    	end,
    	datetime2fromparts(cast(MA.Datum_DT / 10000000000000 as bigint), cast(MA.Datum_DT / 100000000000 as bigint) % 100, cast(MA.Datum_DT / 1000000000 as bigint) % 100, cast(MA.Datum_DT / 10000000 as bigint) % 100, cast(MA.Datum_DT / 100000 as bigint) % 100, cast(MA.Datum_DT / 1000 as bigint) % 100, MA.Datum_DT % 1000, 3),
    	case ma.Kontakt
    		when 0 then 'Téléphone'
    		when 1 then 'Visite'
    		when 210 then 'Visite technique'
    		else ''
    	end,
    	fi.Firma,
    	case ma.Zweck
    		when 210 then '1 - Prospection'
    		when 211 then '2 - Découverte'
    		when 212 then '3 - Négocitation'
    		when 213 then '4 - Développement'
    		when 214 then '5 - Fidélisation'
    		when 215 then '6 - Animation'
    		when 216 then 'Sans but'
    		else ''
    	end,
    	ma.F7003,
    	ma.F7004,
    	concat(ma.Dauer, case ma.Einheit
    		when 1 then ' secondes'
    		when 2 then ' minutes'
    		when 3 then ' heures'
    		when 4 then ' jours'
    		else ''
    	end)
    from wr
    cross join IDCP CP
    inner join TE_ISI_ID ID on ID.id_fi = CP.id_fi and ID.id_pe = CP.id_pe
    inner join TE_ISI_MA MA on MA.Datum_DT between wr.lastmonday and wr.nextsunday and ma.loskz = 0 and ma.TeilnehmerIds like concat('%', format(id.id, '000000000'), ',%') and ma.Kontakt in (1, 3, 210, 211, 212) and ma.Privat = 0
    left outer join TE_ISI_KA ka on ka.LosKZ = 0 and ka.KatNr = 1077 and ka.Code = ma.F7011 and ka.SpracheNr = 0 and ka.ExtKey in ('9001_1077_1', '9001_1077_3')
    inner join TE_ISI_FI FI on FI.ID = MA.ID_FI
    where (ka.id is not null or ma.Kontakt in (0, 210))
    union all
    select
    	case
    		when A3.Startdatum_DT < wr.monday then 1
    		when A3.Startdatum_DT between wr.monday and wr.sunday then 2
    		else 3
    	end,
    	datetime2fromparts(A3.Startdatum_DT / 10000000000000, (A3.Startdatum_DT / 100000000000) % 100, (A3.Startdatum_DT / 1000000000) % 100, (A3.Startdatum_DT / 10000000) % 100, (A3.Startdatum_DT / 100000) % 100, (A3.Startdatum_DT / 1000) % 100, A3.Startdatum_DT % 1000, 3),
    	case A3.A3Grund
    		when 0 then 'Congés'
    		when 1 then 'Maladie'
    		when 2 then 'Autre absence'
    		else ''
    	end,
    	'',
    	'',
    	0,
    	0,
    	''
    from wr
    cross join IDCP CP
    inner join TE_ISI_ID ID on ID.id_fi = CP.id_fi and ID.id_pe = CP.id_pe
    inner join TE_ISI_A3 A3 on A3.BeaId = ID.ID and A3.Startdatum_DT between wr.lastmonday and wr.nextsunday
    order by 1, 2;

    Dans la première partie du UNION, sur la jointure avec TE_ISI_MA, j'ai cette condition :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    inner join TE_ISI_MA MA on MA.Datum_DT between wr.lastmonday and wr.nextsunday and ma.loskz = 0 and ma.TeilnehmerIds like concat('%', format(id.id, '000000000'), ',%') and ma.Kontakt in (1, 3, 210, 211, 212) and ma.Privat = 0

    Je vérifie dont bien que Datum_DT est compris entre la valeur de lundi dernier, et de dimanche prochain (par rapport à la date du jour retrouvée dans la ligne MA.ID = 0x00002329001d9c92 de la CTE "wr").

    En toute logique, une valeur pourrie dans ma table TE_ISI_MA (genre 0 ou une valeur ne respectant pas le format, avec plus ou moins de chiffres) devrait donc être écartée…

    Et pourtant, la requête plantait car SQL Server essayait d'évaluer la valeur "220000000" qui correspond à une activité récurrente à 22h, donc sans la partie date… Cette valeur n'est évidement pas comprise entre 20190826000000000 et 20190915235959000

    Pourtant, SQL Server a tenté d'évaluer le résultat de calcul de la partie SELECT avant d'avoir filtré les lignes avec la jointure…

    Si je passe le flag LosKZ à 1 sur la ligne, ce flag étant lui aussi présents dans la même clause de jointure, alors je n'ai plus de plantage… et la requête est plus de 10 fois plus rapide !

    Il est fou !
    On ne jouit bien que de ce qu’on partage.

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    bonjour,

    Citation Envoyé par StringBuilder Voir le message
    Pourtant, SQL Server a tenté d'évaluer le résultat de calcul de la partie SELECT avant d'avoir filtré les lignes avec la jointure…
    Je pense qu'il s'agit du SELECT de la sous requête (wr)...
    Ces colonne entrent en jeu dans les condition de jointure, il est donc normal qu'elle soient calculée avant certains filtres ou autres conditions de jointure.

    il faudrait regarder les indexes utilisés, mais en en faisant des indexes couvrants (ou au moins en ajoutant les colonnes qui permettent de filtrer les lignes contenant des "mauvaises" valeurs a convertir), cela pourrait résoudre le problème

  5. #5
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 152
    Points : 7 402
    Points
    7 402
    Billets dans le blog
    1
    Par défaut
    Non, la sous-requête wr lit une seule ligne de la table MA, et pour cette ligne la date est correctement renseignée (si j'ose dire).

    C'est bien dans le select final que SQL Server tente de calculer les dates pour des lignes qui pourtant sont exclues par la clause "on" le la jointure sur MA.

    Et j'ai drastiquement amélioré les performances en ajoutant un MA.Datum_DT between 19000000000000000 and 29999999999999999.
    Visiblement, le between sur des colonnes calculées retournées par wr est évalué... après le select, tandis qu'avec des valeurs littérales il est évalué normalement.

    Du coup mon :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    inner join TE_ISI_MA MA on MA.Datum_DT between wr.lastmonday and wr.nextsunday and ma.loskz = 0 and ma.TeilnehmerIds like concat('%', format(id.id, '000000000'), ',%') and ma.Kontakt in (1, 3, 210, 211, 212) and ma.Privat = 0

    S'est transformé en :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    inner join TE_ISI_MA MA on MA.Datum_DT between wr.lastmonday and wr.nextsunday and ma.loskz = 0 and ma.TeilnehmerIds like concat('%', format(id.id, '000000000'), ',%') and ma.Kontakt in (1, 3, 210, 211, 212) and ma.Privat = 0 and MA.Datum_DT between 19000000000000000 and 29999999999999999

    Et je n'ai plus de problème... Sâchant que wr.lastmonday est largement plus grand que 19000000000000000 et wr.nextsunday largement plus petit que 29999999999999999 ça n'a aucun sens mais bon...

    Et accessoirement, je suis passé de 4 minutes (quand ça plantait pas) à 7 secondes...
    On ne jouit bien que de ce qu’on partage.

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Non, la sous-requête wr lit une seule ligne de la table MA, et pour cette ligne la date est correctement renseignée (si j'ose dire).
    A condition que le filtre where MA.ID = 0x00002329001d9c92 soit appliqué avant l'autojointure inner join TE_ISI_MA MA on MA.Datum_DT between wr.lastmonday and wr.nextsunday...

    Il faudrait voir le plan d'exécution...

    Qu'est-ce que ça donne si on enlève les colonnes qui font le datetime2fromparts dans le SELECT final ?

  7. #7
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 152
    Points : 7 402
    Points
    7 402
    Billets dans le blog
    1
    Par défaut
    Ça fonctionne, c'est vraiment le datetime2fromparts() du select final qui pose problème
    On ne jouit bien que de ce qu’on partage.

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Pourquoi ne pas créer une colonne calculée persistante dans votre table qui convertit cette horreur en véritable DATETIME2 ?

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  9. #9
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 152
    Points : 7 402
    Points
    7 402
    Billets dans le blog
    1
    Par défaut
    Malheureusement car je ne maîtrise pas le modèle de données.
    C'est une table d'un outil éditeur (Aurea.CRM pour ne pas le citer) qui modifie lui-même la structure des tables, index, etc.

    Et visiblement ils n'ont pas compris comment fonctionnait le type date...

    Si je crée une colonne calculée, à la prochaine modification de paramétrage ma colonne sera certainement détruite.

    Reste la solution de la vue...
    On ne jouit bien que de ce qu’on partage.

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    ... Reste la solution de la vue...
    Dans ce cas, vue indexée...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Python 3.5.1] Bug ou incompréhension avec append()
    Par funestra dans le forum Général Python
    Réponses: 7
    Dernier message: 05/04/2016, 22h27
  2. [AC-2010] Bug incompréhensible sans message d'erreur avec un NOT IN
    Par SteffieLili dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 18/03/2014, 10h46
  3. [PC] Sockets avec API win32, bug incompréhensible
    Par ValyGator dans le forum Windows
    Réponses: 4
    Dernier message: 27/02/2008, 17h13
  4. Bug Xerces2_1_0 avec C++ et Linux ??
    Par _marie_ dans le forum XML
    Réponses: 2
    Dernier message: 24/09/2003, 07h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo