|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre éclairé
![]() Inscription : octobre 2008 Messages : 327 ![]() |
Bonjour à tous,
J'essaie vainement de créer une procédure transac SQL et je suis super débutant... Voilà à quoi ça ressemble Code :
Code :
SELECT dataid FROM filedata WHERE lang_00='TOTO' AND descid = 3204 la table temp_test a un champ unique TT de type varchar si j'exécute la procédure en mettant en paramètre d'entrée TOTO, la table TEMP_TEST a bien un nouvel enregistrement mais il a pour valeur NULL... Merci de m'avoir lu
__________________
|
||
|
|
00
|
|
|
#2 | ||||||||||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 665 ![]() |
Bonjour,
C'est en fait parce que vous avez déclaré @Fam au type nvarchar. Comme vous n'avez pas précisé de largeur, celle-ci est par défaut à 1, donc 'TOTO' est tronqué à 'T' Pour le vérifier, il suffit d'exécuter : Code :
Si vous réécrivez votre procédure en vous débarrassant des fioritures produites par SQL Server Management Studio (SSMS), vous aurez donc : Code :
- Si la colonne lang_00 ne doit jamais contenir des caractères autres que ceux de l'alphabet latin et des chiffres, passez au type varchar(n) si ce n'est pas déjà le cas. En effet le type nvarchar stocke les caractères en Unicode, qui consomme deux octets par caractère. varchar à l'inverse les stocke en ASCII, qui consomme un octet par caractère, mais ne supporte que les caractères latins (pas ceux des alphabets asiatiques, arabes, ...) Vous pouvez changer le type de votre colonne comme suit : Code :
Programmer en SQL est totalement différent de la façon de programmer en langages par objets ou procéduraux. SQL est un langage déclaratif, donc il vous suffit d'écrire ce que vous souhaitez faire ou obtenir. Dans Les langages par objets ou procéduraux, vous écrivez comment vous voulez arrivez au résultat. Votre début de requête SELECT est : Code :
Voyez l'instruction INSERT que je vais vous donner plus bas. Pour comprendre l'effet, vous pouvez lire ce billet qui traite des triggers, mais l'idée de fond est la même. - Déclarez votre variable @Fam au même type que celui de la colonne lang_00, avec la longueur Cela évite à SQL Server de faire le transtypage qui peut résulter en une lecture complète de la table, au lieu d'utiliser un index de la table - Pourquoi la colonne tt de la table temp_test n'est pas de type numeric ? Regardez la liste des types disponibles sous SQL Server ici, notamment pour le type numeric. Choisissez l'échelle et la précision en fonction de vos besoin, mais en prenant toujours le plus proche supérieur à vos besoins. Par exemple si vous avez besoin de stocker des chaînes dont vous êtes certain qu'elle ne n'auront jamais une longueur plus grande que 40 caractères, il n'y pas besoin de mettre varchar(255) - Qualifiez les noms des objets que vous manipulez (tables, fonctions, procédures, vues) par le nom du schéma auquel ils appartiennent. Par défaut c'est dbo. En bref, plus vous serez précis, moins vous polluerez votre base de données, plus elle a de chances d'être performante (sous réserve que son modèle soit correct !) Finalement, votre procédure peut s'écrire : Code :
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
||||||||||
|
10
|
|
|
#3 | ||
|
Membre éclairé
![]() Inscription : octobre 2008 Messages : 327 ![]() |
Bonjour elsuket,
Merci de cette réponse trés complète ![]() Pour éviter les éventuels doublons dans mes réponses, et les null, je devrais peut-être faire une requête du type Code :
En tout cas merci encore de vos précieux conseils
__________________
|
||
|
|
00
|
|
|
#4 |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 665 ![]() |
Héhé, ça c'est une solution de facilité qui vous posera plus de problèmes qu'autre chose
Vous pourriez traiter les doublons en amont. Quelle est le traitement que vous effectuez et pourquoi avec-vous des doublons ou bien la colonne dataid à NULL ? @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|
00
|
|
|
#5 | ||
|
Membre éclairé
![]() Inscription : octobre 2008 Messages : 327 ![]() |
Re,
Normalement il n'y a aucun doublon pour un descid et un lang_00 donné, le TOP 1 serait juste une mesure de "sécurité" (que je devrais coupler avec un tri, je pense) dataid ne peut-être null que si la requête SELECT ne trouve aucun enregistrement correspondant... mais est-il vraiment NULL d'ailleurs, dans ce cas ? peut-être comme ça ? Code :
__________________
|
||
|
|
00
|
|
|
#6 |
|
Membre éclairé
![]() Inscription : octobre 2008 Messages : 327 ![]() |
Bonjour à tous,
en tout cas, j'ai réussi à faire ma procédure grâce à vous alors merci et je considère le fil comme résolu à bientôt
__________________
|
|
|
00
|
|
|
#7 | |||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 665 ![]() |
Citation:
Lorsque vous vous en rendrez compte, il sera probablement déjà trop tard pour corriger le tir Si vous ne voulez pas les NULL et que vous êtes certain de l'effet de votre requête (c'est à dire ce qu'elle signifie pour l'application que vous participez à écrire), il vous suffit de filtrer la clause SELECT de l'INSERT de la procédure stockée que je vous ai proposée : Code :
Mais je continue de penser que si vous écrivez ce code par "mesure de sécurité", c'est qu'il y a quelque chose à revoir dans la façon dont les données arrivent dans la table dbo.filedata @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|||
|
10
|
|
|
#8 |
|
Membre éclairé
![]() Inscription : octobre 2008 Messages : 327 ![]() |
Bonjour elsuket,
Merci, le mieux est que je fouille plus avant le fonctionnement actuel de l'application, ça permettra d'être sûr de la requête à réaliser pour être cohérent avec les données existantes
__________________
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com