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 :

Remplacer une multitude de variables : 1000 par une table temporaire? [2014]


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Remplacer une multitude de variables : 1000 par une table temporaire?
    Bonjour,

    Actuellement une application multithread envois des requêtes avec une multitude de variables au serveur SQL Server, voici le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    exec sp_executesql N'SELECT [t].[Id] AS [key], [t].[Text] AS [value]
    FROM [dbo].[Table] AS [t]
    WHERE [t].[Text] IN (@p0, ..., @p999)',N'@p0 nvarchar(4000),...,@p999 nvarchar(4000)'
    ,@p0=N'Toto',...,@p999=N'Tata'
    Je pensais remplacer les variables par une table temporaire envoyé en paramètre d'une ProcStock

    mais il faut d'abord remplir un type table avant de pouvoir utiliser la ProcStock

    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
     
    CREATE TYPE MaTableType AS TABLE   
    (
        text varchar(30)  
    )  
    go
    CREATE PROCEDURE dbo.SelectIdFromText
        @tTable MaTableType READONLY  
        AS   
        SET NOCOUNT ON  
     
        SELECT [t].[Id] AS [key], [t].[Text] AS [value]
        FROM [dbo].[Table] AS [t]
        inner join @tTable as [t1]
        on [t0].text=[t1].text
     
    GO
    Et je ne vois pas comment faire

    Si quelqu'un a une idée

    Merci

  2. #2
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Bonjour,

    Si tu veux remplacer ce qui est fait actuellement par quelque chose de plus propre.
    Tu devrais nous parler de ce qu cela est sensé faire. (Le besoin) Cela nous aidera à te diriger vers la solution technique la plus adapter.

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    L'application récupère les infos (Text) dans un fichier plat, exécute la requête pour récupérer les Id en Base et replace l'info dans le fichier plat pour qu'un autre process continue le traitement.

    Exemple : si dans le fichier il y a 5220 info (Text) différentes il lance 6 fois la requêtes 5*1000 + 1*220.

    Cela provoque en plus la mise en mémoire de plusieurs plan d'exécutions

    Merci

  4. #4
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Donc si on résume :

    En entrée, on a un fichier plat et une table clé/valeur.

    En sortie, on a un nouveau fichier plat où les clés de la table présente dans le fichiers ont été remplacé par les valeurs correspondante.

    Il y a plusieurs moyen de faire.
    L'une d'elle est effectivement de créer un table temporaire (sans doublon de préférence) où chaque variable présente dans le fichier est stockés pour généré la correspondance.
    En général, pour généré le multi-threading, on se base sur un nom de table pré-définit, soit avec un identifiant unique en post-fix ou un tablespace distinct pour chaque thread avec un utilisateur différent (En tout cas, sous Oracle).

    Un autre moyen serai de faire une requête avec un "bind variable". La requête de serai simplement la récupération de la valeur en fonction de la clé. Avec le "bind varaible" le plan d'exécution ne sera calculé qu'une seule fois.

    Un dernier moyen est de récupéré le contenu de la table clé/valeur en mémoire et de faire le remplacement directement. (Note : Valable, si le nombre de clé/valeur est relativement réduit.)

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  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
    Le problème porte sur quoi ?
    - La création de la table temporaire depuis le programme ?
    - L'envoi d'un tableau mémoire depuis le programme à la base de données sous forme d'une table temporaire ?

    Pour le premier moins, je pense qu'une partie de la réponse se situe plus haut.

    Pour le second point, cela dépend évidement du langage utilisé par l'application cliente.
    En .NET, voici comment faire : (exemple de code en C#)
    http://stackoverflow.com/questions/5...-from-net-code
    On ne jouit bien que de ce qu’on partage.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Merci pour vos réponses,c'est gentil d'avoir pris du temps pour répondre.

    Le lien proposé par StringBuilder est exactement ce que je cherchais. Il ne reste plus qu'a présenter la solution aux DEVs

    merci encore

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/11/2014, 16h44
  2. Réponses: 14
    Dernier message: 24/02/2012, 17h04
  3. Remplacer le contenu d'un #define par une variable ?
    Par lcoulon dans le forum Débuter
    Réponses: 34
    Dernier message: 22/10/2009, 15h19
  4. Réponses: 7
    Dernier message: 03/10/2007, 17h58
  5. Réponses: 4
    Dernier message: 16/04/2007, 16h30

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