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

Sybase Discussion :

Utiliser une table sélectionnée


Sujet :

Sybase

  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 534
    Points : 562
    Points
    562
    Par défaut Utiliser une table sélectionnée
    Bonjour,

    Je souhaite de faire ceci avec un SQL stored procedure

    Code : 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
    
    Create procedure MktCacheGetXXXX
    (
        @Provider       varchar(10),
        @AsOfDate     datetime,
        @Instrument   varchar(20),
        @Type           varchar(20),
        @ListNames    varchar(200)
    )
    As
    Begin    
        Declare @TableName  varchar(20)
        Set @TableName = Upper(@Type)
    
            Select
                InstrumentOne   = M_TYPE,
                InstrumentTwo   = M_NAME,
                Object          = M_OBJECT
            From @TableName
            Where M_INSTRUMENT in (@Instrument)
                and M_PROVIDER in (@Provider)
                and M_DATE in (@AsOfDate)
                and M_TYPE in (@ListNames)
                and M_NAME in (@ListNames)
            Order by M_PROVIDER, M_INSTRUMENT, M_DATE, M_TYPE
    
    
    End
    

    Au lieu de faire comme ceci:

    Code : 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
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    
    
        If Upper(@Type) = 'COCO'
        Begin
            Select
                InstrumentOne   = M_TYPE,
                InstrumentTwo   = M_NAME,
                Object          = M_OBJECT
            From COCO
            Where M_INSTRUMENT in (@Instrument)
                and M_PROVIDER in (@Provider)
                and M_DATE in (@AsOfDate)
                and M_TYPE in (@ListNames)
                and M_NAME in (@ListNames)
            Order by M_PROVIDER, M_INSTRUMENT, M_DATE, M_TYPE
        End
        Else If Upper(@Type) = 'COEQ'
        Begin
            Select
                InstrumentOne   = M_TYPE,
                InstrumentTwo   = M_NAME,
                Object          = M_OBJECT
            From COEQ
            Where M_INSTRUMENT in (@Instrument)
                and M_PROVIDER in (@Provider)
                and M_DATE in (@AsOfDate)
                and M_TYPE in (@ListNames)
                and M_NAME in (@ListNames)
            Order by M_PROVIDER, M_INSTRUMENT, M_DATE, M_TYPE
        End
        Else If Upper(@Type) = 'COFX'
        Begin
            Select
                InstrumentOne   = M_TYPE,
                InstrumentTwo   = M_NAME,
                Object          = M_OBJECT
            From COFX
            Where M_INSTRUMENT in (@Instrument)
                and M_PROVIDER in (@Provider)
                and M_DATE in (@AsOfDate)
                and M_TYPE in (@ListNames)
                and M_NAME in (@ListNames)
            Order by M_PROVIDER, M_INSTRUMENT, M_DATE, M_TYPE
        End
        Else If Upper(@Type) = 'COIR'
        Begin
            Select
                InstrumentOne   = M_TYPE,
                InstrumentTwo   = M_NAME,
                Object          = M_OBJECT
            From COIR
            Where M_INSTRUMENT in (@Instrument)
                and M_PROVIDER in (@Provider)
                and M_DATE in (@AsOfDate)
                and M_TYPE in (@ListNames)
                and M_NAME in (@ListNames)
            Order by M_PROVIDER, M_INSTRUMENT, M_DATE, M_TYPE
        End
        Else If Upper(@Type) = 'EQEQ'
        Begin
            Select
                InstrumentOne   = M_TYPE,
                InstrumentTwo   = M_NAME,
                Object          = M_OBJECT
            From EQEQ
            Where M_INSTRUMENT in (@Instrument)
                and M_PROVIDER in (@Provider)
                and M_DATE in (@AsOfDate)
                and M_TYPE in (@ListNames)
                and M_NAME in (@ListNames)
            Order by M_PROVIDER, M_INSTRUMENT, M_DATE, M_TYPE
        End
        Else If Upper(@Type) = 'EQFX'
        Begin
            Select
                InstrumentOne   = M_TYPE,
                InstrumentTwo   = M_NAME,
                Object          = M_OBJECT
            From EQFX
            Where M_INSTRUMENT in (@Instrument)
                and M_PROVIDER in (@Provider)
                and M_DATE in (@AsOfDate)
                and M_TYPE in (@ListNames)
                and M_NAME in (@ListNames)
            Order by M_PROVIDER, M_INSTRUMENT, M_DATE, M_TYPE
        End
        Else If Upper(@Type) = 'EQIR'
        Begin
            Select
                InstrumentOne   = M_TYPE,
                InstrumentTwo   = M_NAME,
                Object          = M_OBJECT
            From EQIR
            Where M_INSTRUMENT in (@Instrument)
                and M_PROVIDER in (@Provider)
                and M_DATE in (@AsOfDate)
                and M_TYPE in (@ListNames)
                and M_NAME in (@ListNames)
            Order by M_PROVIDER, M_INSTRUMENT, M_DATE, M_TYPE
        End
        Else If Upper(@Type) = 'FXFX'
        Begin
            Select
                InstrumentOne   = M_TYPE,
                InstrumentTwo   = M_NAME,
                Object          = M_OBJECT
            From FXFX
            Where M_INSTRUMENT in (@Instrument)
                and M_PROVIDER in (@Provider)
                and M_DATE in (@AsOfDate)
                and M_TYPE in (@ListNames)
                and M_NAME in (@ListNames)
            Order by M_PROVIDER, M_INSTRUMENT, M_DATE, M_TYPE
        End
        Else If Upper(@Type) = 'FXIR'
        Begin
            Select
                InstrumentOne   = M_TYPE,
                InstrumentTwo   = M_NAME,
                Object          = M_OBJECT
            From FXIR
            Where M_INSTRUMENT in (@Instrument)
                and M_PROVIDER in (@Provider)
                and M_DATE in (@AsOfDate)
                and M_TYPE in (@ListNames)
                and M_NAME in (@ListNames)
            Order by M_PROVIDER, M_INSTRUMENT, M_DATE, M_TYPE
        End
        Else If Upper(@Type) = 'IRIR'
        Begin
            Select
                InstrumentOne   = M_TYPE,
                InstrumentTwo   = M_NAME,
                Object          = M_OBJECT
            From IRIR
            Where M_INSTRUMENT in (@Instrument)
                and M_PROVIDER in (@Provider)
                and M_DATE in (@AsOfDate)
                and M_TYPE in (@ListNames)
                and M_NAME in (@ListNames)
            Order by M_PROVIDER, M_INSTRUMENT, M_DATE, M_TYPE
        End
    
    Les tables ont les mêmes colonnes (même nom) mais leur contenu est différent.

    Merci

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Points : 1 828
    Points
    1 828
    Par défaut
    Il faut utiliser un execute immediate, comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    create proc ma_proc 
        @tab varchar(30),
        @var int
    as
    declare @sql varchar(1000)
     
    -- Creer le statement SQL dynamiquement:
    select @sql = 'select ..... from ' + @tab + ' where colonne = @var and ....'
     
    -- et l'executer
    exec (@sql)
    Et voilà!

    Michael
    Michael Peppler
    Membre de TeamSybase - www.teamsybase.com

    "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson

  3. #3
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Citation Envoyé par mpeppler Voir le message
    Il faut utiliser un execute immediate, comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    create proc ma_proc 
        @tab varchar(30),
        @var int
    as
    declare @sql varchar(1000)
     
    -- Creer le statement SQL dynamiquement:
    select @sql = 'select ..... from ' + @tab + ' where colonne = @var and ....'
     
    -- et l'executer
    exec (@sql)
    Et voilà!

    Michael
    Bonjour Michael,

    Je voulais aussi suggérer cette proposition, seulement il me semble que l'on soit limité a 255 caractères lors de l'execution de SQL dynamique (ASE 12.5). La première fois que j'avais tenté la chose avec une chaîne plus longue, ça plantait sans que je sache pourquoi

    A vérifier donc que la chaîne transmise soit exécutée dans son intégratlité donc


    Arnaud
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  4. #4
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 534
    Points : 562
    Points
    562
    Par défaut
    Ma procedure pourrait contenir plus de 255 caractères.
    Pour les procedures ont moins de 255 caractères ca marche bien.

    Merci

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Points : 1 828
    Points
    1 828
    Par défaut
    Depuis la 12.5 on peut avoir des variables varchar() jusqu'à 16k (16384).

    Si il s'agit d'une version d'ASE plus ancienne il y a évidemment un problème - et il n'y a pas à ma connaissance d'autre solution pour pouvoir spécifier la table dynamiquement.

    Michael
    Michael Peppler
    Membre de TeamSybase - www.teamsybase.com

    "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson

  6. #6
    Membre habitué
    Inscrit en
    Août 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 134
    Points : 168
    Points
    168
    Par défaut
    Citation Envoyé par mpeppler Voir le message
    Depuis la 12.5 on peut avoir des variables varchar() jusqu'à 16k (16384).

    Si il s'agit d'une version d'ASE plus ancienne il y a évidemment un problème - et il n'y a pas à ma connaissance d'autre solution pour pouvoir spécifier la table dynamiquement.

    Michael
    On peut utiliser sp_remotesql et faire un rpc vers le serveur local.
    sp_remotesql accepte 251 paramètres qui sont des varchar(255).

    Il est aussi possible de créer une table proxy (en tempdb par exemple) pointant vers la table désirée puis utiliser cette table dans la procédure stockée.
    DBA sybase confirmé
    Cherche un poste sur Paris

  7. #7
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 222
    Points : 19 551
    Points
    19 551
    Billets dans le blog
    25
    Par défaut
    ou encore de faire un shell-script permettant de passer la table en paramètre... et de lancer tout ça en direct/sans execute immediate...
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

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

Discussions similaires

  1. Application utilisant une table paradox
    Par Pierre95 dans le forum Bases de données
    Réponses: 3
    Dernier message: 04/12/2006, 07h47
  2. Utiliser une table MySQL dans un menu deroulant de formulaire
    Par darkfazer dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 17/10/2006, 23h16
  3. utiliser une table ou une vue
    Par ljoly dans le forum Oracle
    Réponses: 14
    Dernier message: 05/07/2006, 15h49
  4. utiliser une table paradox en meme temps
    Par kalou26 dans le forum C++Builder
    Réponses: 5
    Dernier message: 15/06/2006, 18h04
  5. [18F452] Utiliser une Table sur un 18F
    Par MCASM dans le forum Autres architectures
    Réponses: 2
    Dernier message: 18/04/2006, 22h48

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