|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
|
Futur Membre du Club
![]() Médecin Département d'Information Médicale (DIM) Inscription : janvier 2009 Messages : 77 ![]() |
Bonjour
Je souhaite déclarer des variables regroupées: Soit le champ REF qui prend ses valeurs sur 4 caractères selon le modèle suivant: 0001, 0002, 0003, 0004 etc... Je veux pouvoir le scinder (par exemple) en REF_1 qui comprend les valeurs [0001,0009,0025,0985] REF_2 qui comprend les valeurs [0002,0003,0222,0246,0333,0456,0999] etc etc...avec les variables REF_X comprenant un nombre variable de valeurs REF sur 4 caractères NB: Ces REF sont bien sûr listées dans une table TABLE_REF DECLARE @REF_1 (ici je ne sais pas quoi mettre comme format: VARCHAR(xxx)? SET @REF_1= [0001,0009,0025,0985] en utilisant la syntaxe correcte, les virgules, les parenthèses ne fonctionnent pas pour avoir une requête du type: Code :
Cordialement |
||
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Bonjour
Pouvez vous nous en dire plus sur le contexte, on comprendra surement mieux le but de tout ca. Sur le principe, je pense qu'il vous faut une variable table... Mais vous pouvez peut être faire directement une jointure sur la table des références, ce qui serait nettement mieux ? Comment est générée et d'ou provient la liste des références pour la requête ? |
|
|
00
|
|
|
#3 | |
|
Membre Expert
![]() |
Citation:
En effet cela me semble surtout être une usine à gaz bien dégueul...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
|
|
|
00
|
|
|
#4 | ||||
|
Futur Membre du Club
![]() Médecin Département d'Information Médicale (DIM) Inscription : janvier 2009 Messages : 77 ![]() |
Faire une jointure sur ma table des références ne me sert à rien (je sais faire et ce n'est pas ce que je veux car sinon, outre le fait que je l'aurais déjà fait, mon problème est de ne pas perdre mon temps à rentrer des conditions différentes à chaque requête; d'où le principe de la variable ;=)))
=>Ce que je veux, c'est regrouper un certain nombre de références de cette table (ou d'ailleurs n'importe quelle valeur provenat d'une autre table ou non) et les déclarer en variable. D'autant plus que je veux déclarer PLUSIEURS groupes de variables Par analogie, imaginons que je ne veuille déclarer qu'une seule valeur: Code :
Il faudrait une syntaxe qui fonctionne et me permette par analogie: DECLARE @REF CHAR(4) SET @REF=('0001','0003','0006') et en l'occurrence peu importe que ces données soient issues d'ailleurs ou non d'une des tables de ma base Je crois qu'il y a la possibilité de déclarer des variables '@Tables', chaque table correspond à un certain nombre de valeurs; cela répondrait à mon problème, mais je n'arrive pas à comprendre correctement la syntaxe sur ce que je trouve via Mr google Il y aurait quelque chose qui ressemblerait à Code :
Merci |
||||
|
|
00
|
|
|
#5 |
|
Membre Expert
![]() |
Créez un userType dans votre base de données de type TABLE avec la structure que vous voulez...
Ensuite vous pouvez définir cette variable comme variable d'entrée de votre procédure stockée par exemple et l'utiliser comme une table normale... Ces tables s'appelles plus communemment Table Valued Parameter (TVP) et peut être manipulé également en C# (sauf LINQ TO SQL je crois). Il est toutefois déconseillé de les utiliser pour de la volumétrie (>1000)
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
|
|
00
|
|
|
#6 | |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Citation:
Car votre problème a de nombreuses solutions, de la plus performante, à la plus :Et savoir comment est générée la liste est important, ainsi que son format ! |
|
|
|
00
|
|
|
#7 | ||||||
|
Futur Membre du Club
![]() Médecin Département d'Information Médicale (DIM) Inscription : janvier 2009 Messages : 77 ![]() |
Merci Iberserk mais si je comprends le principe, je ne sais pas comment faire en pratique car je n'ai pas assez de bagage.
Je ne connais pas le C# non plus (enfin je veux dire que je n'en connais pas la syntaxe) J'imagine quelque chose comme: Code :
Si je prends des valeurs issues d'une table de ma base (ce qui ne règle pas le problème pour des valeurs autres que je souhaiterais renseigner) J'essaye cela: Code :
Je ne sais pas s'il faut faire comme ça, mais dans l'affirmative, comment faire après? Code :
Cordialement |
||||||
|
|
00
|
|
|
#8 | ||||||||
|
Membre Expert
![]() |
Citation:
Citation:
Vous allez créer un type table Code :
Code :
Puis vos traitements: Code :
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
||||||||
|
|
00
|
|
|
#9 |
|
Futur Membre du Club
![]() Médecin Département d'Information Médicale (DIM) Inscription : janvier 2009 Messages : 77 ![]() |
J'ai appelé ma colonne MONCHAMP, c'est osé
Pour le reste, merci j'essaye dès l'aube demain et reviens (je l'espère) clore le thread Merci |
|
|
00
|
|
|
#10 | ||
|
Futur Membre du Club
![]() Médecin Département d'Information Médicale (DIM) Inscription : janvier 2009 Messages : 77 ![]() |
ce la n'a pas l'air de marcher.
Voici avec une requête simple sur une Table de ma Base ce que cela donne Code sql :
Voici les Messages d'Erreur: Serveur*: Msg 156, Niveau 15, État 1, Ligne 1 Syntaxe incorrecte vers le mot clé 'TABLE'. Serveur*: Msg 1087, Niveau 15, État 1, Ligne 6 La variable de table "@POLE_BACH" doit être déclarée. Serveur*: Msg 1087, Niveau 15, État 1, Ligne 12 La variable de table "@POLE_BACH" doit être déclarée. |
||
|
|
00
|
|
|
#11 | ||||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 668 ![]() |
Bonjour,
Changez : Code :
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 |
||||
|
00
|
|
|
#12 | ||
|
Futur Membre du Club
![]() Médecin Département d'Information Médicale (DIM) Inscription : janvier 2009 Messages : 77 ![]() |
C'est mieux, cela enlève une partie des messages mais:
Code sql :
Message d'ERREUR: Serveur*: Msg 137, Niveau 16, État 1, Ligne 12 La variable scalaire "@POLE_BACH" doit être déclarée. On s'approche!! |
||
|
|
00
|
|
|
#13 | ||||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Utilisez un alias pour votre table variable dans la requete :
Code SQL :
Cela dit, au risque de me répéter, je ne vois pas l'intérêt de cette table variable ici : Code SQL :
|
||||
|
|
00
|
|
|
#14 | ||
|
Membre Expert
![]() |
Citation:
Citation:
)
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
||
|
|
00
|
|
|
#15 |
|
Futur Membre du Club
![]() Médecin Département d'Information Médicale (DIM) Inscription : janvier 2009 Messages : 77 ![]() |
Bon cela fonctionne
Sur le fond, bien évidemment une procédure va s'imposer. Mais ce sont les informaticiens qui ont la main (du reste je ne sais pas -encore- faire une procédure stockée), et en attendant, sur un système usine à gaz sur lesquelles je dois faire des multiples regroupements pour faire des requêtes sensiblement plus complexes qu'un SELECT * sur une table unique; si je peux m'éviter de me tartiner à taper de multiples fois des variables différentes, j'ai déjà gagné du tempsEN tous cas merci à tous |
|
|
00
|
|
|
#16 | |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
C'est peut être la raison pour laquelle ma question vous paraissait futile :
Citation:
Car même si cette question parait bien secondaire, cela va en fait conditionner les façons de faire la requête ensuite ! |
|
|
|
00
|
|
|
#17 |
|
Futur Membre du Club
![]() Médecin Département d'Information Médicale (DIM) Inscription : janvier 2009 Messages : 77 ![]() |
Merci
Je vais d'ores et déjà me pencher sur la question, dans un premier temps apprendre à écrire des procédures stockées et voir quelles sont les obligations à remplir. Merci en tous cas de vos réponses, et de vos conseils |
|
|
00
|
|
|
#18 |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 668 ![]() |
Utiliser une variable de type table est de toute façon une erreur :
- soit de méconnaissance de T-SQL, - soit de conception de la base de données. D'autre part vous noterez que lorsque vous utilisez une variable de type table, SQL Server estimera toujours qu'elle contient une et une seule ligne, et vous ne pouvez rien faire pour changer cela. En conséquence, cela peut conduire l'optimiseur de requêtes à sur ou sous-estimer les cardinalités, donc utiliser des index qui ne conviennent pas à la requête en terme de performance. La raison sous-jacente est que SQL Server ne maintient aucune statistique sur une telle table (car oui, une variable de type table, comme toute table, est persistée physiquement dans la base de données TempDB, base de données système utilisé pour bien d'autre choses que vos chères données !) Le mieux reste donc d'utiliser une véritable table utilisateur, quitte pour cela à passer une liste de valeurs (mais là encore cela révèle une mauvaise conception) dans une chaîne de caractères, et à la dépouiller pour en extraire les valeurs atomiques, puis les insérer dans la table. @++
__________________
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
|
|
|
#19 | ||
|
Futur Membre du Club
![]() Médecin Département d'Information Médicale (DIM) Inscription : janvier 2009 Messages : 77 ![]() |
Elkuset, cette réponse m'intéresse mais je n'en saisis pas forcément toute la portée.
En effet 1.La base est particulièrement mal conçue 2.Ma méconnaissance de T-SQL est grande Mais c'est justement en raison du point 1 que ne pouvant pas extraire correctement certaines données, mais aussi en raison du point 2, que j'essaye d'arriver à mes fins. et si les moyens que j'essaye de mettre en oeuvre pour cela sont inappropriés informatiquement parlant, faute d'expertise suffisante, je suis sur la voie de la connaissance : Et je pars de loin; du début dirais-je... De ce point de vue 'it's a long way to the top....' Citation:
Citation:
Bye
|
||
|
|
00
|
|
|
#20 | |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 668 ![]() |
Citation:
- Dans quelle table : son nom est calculé à l'exécution, c'est une suite de chiffres et de lettres - Combien de temps : elle est conservée pour la durée de la session. Dès que la session est fermée, la table est supprimée. @++
__________________
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
|
Copyright © 2000-2012 - www.developpez.com