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 :

Variable de grande taille typée caractères


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    FMJ
    FMJ est déconnecté
    Membre éclairé
    Profil pro
    tutu
    Inscrit en
    Octobre 2003
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : Octobre 2003
    Messages : 417
    Par défaut Variable de grande taille typée caractères
    Bonjour,

    Jusqu'à présent, je n'avais jamais été confronté à ce cas de figure.

    J'ai besoin d'exécuté une requête crée dynamiquement avec SP_EXECUTESQL. Jusqu'à là rien d'exceptionnel.
    Sauf que la longueur en caractères de la requête peut être extrêmement importante car la table sur laquelle elle porte comprend un (trop) très grand nombre de colonnes (mais là je ne peux rien y faire). Quand je dis important, c'est plus de 4000 caractères de long. Bref aucun type sous SQL 2000 (donc exit NVARCHAR(MAX) ) ne répond à ce besoin.

    J'entrevois deux options :
    > soit passer par une table temporaire (qui va pas faciliter la lecture du code)
    > soit passer par ... l'utilisation de plusieurs variables de type NCHAR. Dès que la taille d'une des variables approche les 4000 caractères, la suite de la requête est enregistrée dans une autre variable.
    A la fin on exécute SP_EXECUTESQL @reqSQL1 + @reqSQL2 + ......

    Aucune autre solution un peu plus élégante ?
    Merci

  2. #2
    FMJ
    FMJ est déconnecté
    Membre éclairé
    Profil pro
    tutu
    Inscrit en
    Octobre 2003
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : Octobre 2003
    Messages : 417
    Par défaut
    J'ai fini par trouver un fil traitant du sujet. A priori il n'y a pas vraiment de solution élégante.
    http://www.developpez.net/forums/d99...l/#post5558441

  3. #3
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 197
    Billets dans le blog
    1
    Par défaut
    - Si je ne m'abuse, NVARCHAR(max) est un type "à part", c'est n'est pas un NVARCHAR "de taille maximale, donc de 4000 octets". Ce type permet de stocker plusieurs Go de données (je ne sais plus si la limitation de 2 Go est levée ou non avec ce type, il me semble que oui.
    - En revanche, sp_execute prends en paramètre un nvarchar, donc au maximum un nvarchar(4000). A tester quand même, mais à mon avis, c'est là que ça tronque.

    La solution qui me semble la plus simple à mettre en oeuvre, c'est de créer une vue avec des colonnes "a, b, c, d, e, ... aa, ab, ac..." afin de remplacer par un nom plus court les colonnes de la table.
    Il suffira d'interroger cette vue plutôt que la table.

    Sinon, autres solution, créer plusieurs vues qui comprennent un nombre limité de champs de la table, regroupés par exemple par domaine fonctionnel.

    Dans tous les cas, un coup de boule au chef de projet qui a modélisé cette merde ne sera pas de trop.

  4. #4
    Membre Expert

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    - Si je ne m'abuse, NVARCHAR(max) est un type "à part", c'est n'est pas un NVARCHAR "de taille maximale, donc de 4000 octets". Ce type permet de stocker plusieurs Go de données (je ne sais plus si la limitation de 2 Go est levée ou non avec ce type, il me semble que oui.
    Non pas sous SQL Server 2000 ! NVARCHAR est limité à 4000 octets sous SQL 2000
    Etienne ZINZINDOHOUE
    Billets-Articles

  5. #5
    FMJ
    FMJ est déconnecté
    Membre éclairé
    Profil pro
    tutu
    Inscrit en
    Octobre 2003
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : Octobre 2003
    Messages : 417
    Par défaut
    Merci pour les réponses.

    En ce qui concerne la proposition de vue, ça ne marchera pas car il s'agit d'une requête de mise à jour.

    Quant à l'éminent architecte qui a pondu ce superbe schéma, c'est un grand éditeur français dont je préfère taire le nom (cette table fait 215 colonnes pour potentiellement des millions de lignes ... si si ! ).

  6. #6
    FMJ
    FMJ est déconnecté
    Membre éclairé
    Profil pro
    tutu
    Inscrit en
    Octobre 2003
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : Octobre 2003
    Messages : 417
    Par défaut
    En fait, après tests, le plus simple, c'est de passer par deux variables, mais on doit utiliser EXEC seul et non EXEC SP_EXECUTESQL à cause de la concaténation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXEC EXEC ('UPDATE tables SET '+ @reqSQL2 + @reqSQL3 + ' WHERE conditions)
    C'est pas beau, mais ça marche

  7. #7
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 197
    Billets dans le blog
    1
    Par défaut
    zinzineti > nvarchar(max) n'existe pas sous SQL Server 2000, donc la question se pose pas.

    FMJ > SQL Server est parfaitement capable de faire des UPDATE à partir d'une table, soit en indiquant un trigger, soit en écrivant la requête de façon à ne transformer aucune donnée et ramener la clé primaire.

    Mais si votre solution avec concaténation fonctionne, tant mieux, ça évite de tout casser votre code.

  8. #8
    Membre éprouvé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2011
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 118
    Par défaut
    Citation Envoyé par FMJ Voir le message
    ...
    En ce qui concerne la proposition de vue, ça ne marchera pas car il s'agit d'une requête de mise à jour.
    ...
    Bonjour.
    Il est tout à fait possible de faire un Update sur une table depuis une vue.

    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
    CREATE TABLE TABLE_TEST
    (
    	  Id INT
    	, Libelle NVARCHAR(255)
    )
    GO
     
    CREATE VIEW v_TABLE_TEST
    AS
    SELECT Id AS I, Libelle AS L FROM TABLE_TEST
    GO
     
    INSERT INTO TABLE_TEST (Id, Libelle) VALUES (1, 'Mon premier libellé');
    INSERT INTO TABLE_TEST (Id, Libelle) VALUES (2, 'Mon deuxième libellé');
    INSERT INTO TABLE_TEST (Id, Libelle) VALUES (3, 'Mon troisième libellé');
    GO
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM TABLE_TEST
    Résultats :
    Id Libelle
    1 Mon premier libellé
    2 Mon deuxième libellé
    3 Mon troisième libellé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE v_TABLE_TEST SET L = 'Modification du troisième libellé' WHERE I = 3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM TABLE_TEST
    Résultats :
    Id Libelle
    1 Mon premier libellé
    2 Mon deuxième libellé
    3 Modification du troisième libellé

Discussions similaires

  1. Réponses: 3
    Dernier message: 12/06/2012, 13h25
  2. Réponses: 5
    Dernier message: 21/09/2011, 11h43
  3. Problème de variable (grande taille)
    Par jack_x4 dans le forum C
    Réponses: 20
    Dernier message: 04/05/2008, 21h14
  4. Réponses: 5
    Dernier message: 21/11/2006, 16h24
  5. Réponses: 6
    Dernier message: 19/10/2004, 13h46

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