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

MS SQL Server Discussion :

creer Procédure sous sql server


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Février 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 32
    Par défaut creer Procédure sous sql server
    Bonjour,
    Dans le cadre de mon projet sur sqlserver, j'ai une table composé de 4
    colonnes.
    La première A colonne contient 4 valeurs:de 1 jusqu'à 4.
    La deuxième colonne B contient 5 valeurs: de 1 jusqu'à' à 4 avec la valeur NULL.
    La troisième colonne C contient 5 valeurs: de 1 jusqu'à' à 4 avec la valeur NULL.

    Dans la 4eme colonne "combinaison", il faut créer une combinaison entre les colonnes A,B,C. exemple 1 ere valeur 1 c'est la combinaison 1, null,null
    2 eme valeur c'est la combinaison 2,1,null.
    J'ai pensé a créer une procédure qui met a jour la colonne combinaison.
    voici l'idée:
    For(i=1;i<4;i++)
    For(j=1;i<5;j++)
    For(k=1;i<5;k++)
    et après update table set valeur++.
    J'ai 2 problèmes:
    1 La syntaxe:je n'arrive pas à créer cette procédure
    2 valeur nul:Comment gérer les valeurs null alors que le compteur commence de 1
    Merci de me proposer des solutions ou de corrections.
    MERCI

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Dans la 4eme colonne "combinaison", il faut créer une combinaison entre les colonnes A,B,C. exemple 1 ere valeur 1 c'est la combinaison 1, null,null
    2 eme valeur c'est la combinaison 2,1,null.
    Ceci est faux parce que si vous stockez la suite de valeurs dans la 4e colonne, alors votre table ne respecte pas la première forme normale.
    Celle-ci dicte que toute valeur stockée dans une colonne doit être atomique.

    Si vous faites donc le contraire, vous partirez dans des requêtes tordues et longues et difficiles à écrire, en plus d'être bien évidemment contre-performantes.

    J'ai pensé a créer une procédure qui met a jour la colonne combinaison.
    voici l'idée:
    For(i=1;i<4;i++)
    For(j=1;i<5;j++)
    For(k=1;i<5;k++)
    et après update table set valeur++.
    Quand vous codez en SQL, et plus particulièrement en T-SQL, l'implémentation de SQL de Sybase et Microsoft (et d'autres ...), ne pensez plus comme vous coderiez dans un langage fonctionnel.
    Dans un langage fonctionnel, vous écrivez comment vous voulez arriver à un résultat.
    SQL est un langage déclaratif, donc vous lui dictez ce que vous voulez, et le moteur de bases de données le reste.

    D'autre part SQL est un langage ensembliste, puisqu'il est fondé sur la théorie des ensembles.
    En conséquence un bout de code qui serait traduit en SQL à partir de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For(i=1;i<4;i++)
    For(j=1;i<5;j++)
    For(k=1;i<5;k++)
    et après update table set valeur++.
    Serait lent en plus d'être moche.

    La syntaxe:je n'arrive pas à créer cette procédure
    C'est normal, ce n'est pas du SQL, ni du T-SQL

    valeur nul:Comment gérer les valeurs null alors que le compteur commence de 1
    NULL n'est pas une valeur, c'est un marqueur qui indique l'absence de valeur.
    D'aileurs si vous exécutez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    IF NULL = NULL
    	SELECT 'OK'
    ELSE SELECT 'KO'
    Vous obtiendrez KO, ce qui prouve que NULL n'est pas une valeur.
    Vous pouvez essayer tout autre opérateur arithmétique, vous obtiendrez toujours le même résultat.

    Donc pour calculer toutes les combinaisons dont vous avez besoin, on peut créer la table suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE uneTableDeQuatreColonnes
    (
    	A tinyint
    	, B tinyint
    	, C tinyint
    )
    Et pour peupler la table comme suit :

    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
    ;WITH
    	A AS
    	(
    		SELECT	1 AS A
    		UNION ALL SELECT 2
    		UNION ALL SELECT 3
    		UNION ALL SELECT 4
    	)
    	, B AS
    	(
    		SELECT	1 AS B
    		UNION ALL SELECT 2
    		UNION ALL SELECT 3
    		UNION ALL SELECT 4
    		UNION ALL SELECT NULL
    	)
    INSERT		dbo.uneTableDeQuatreColonnes
    SELECT		A.A
    		, B.B
    		, C.B
    FROM		A AS A
    CROSS JOIN	B AS B
    CROSS JOIN	B AS C
    GO
    Je crée ce que l'on appelle des expression de tables communes (deux, A et B), introduites par le mot clé WITH.
    Pour chacune d'entre-elles, je les peuple avec les valeurs de votre énoncé.

    Ensuite j’effectue un produit cartésien introduit par CROSS JOIN.
    Donc si par exemple j'ai 4 valeurs dans A et 2 valeurs dans B, j'aurai 8 lignes.
    Comme j'ai 4 valeurs dans A et 5 dans B, j'en ai 20.

    Ensuite comme le jeu de valeurs de C est le même que B, je le réutilise et l'aliasse C.
    J'avais 20 valeurs, que je remultiplie par 5, j'ai donc 100 combinaisons.

    Si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT	*
    FROM	dbo.uneTableDeQuatreColonnes
    J'ai bien 100 lignes.

    Je vous conseille très vivement de commencer par apprendre ce qu'est SQL.
    Pour cela le site de SQLPro contient tout ce qu'il faut

    @++

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Février 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 32
    Par défaut
    Merci elsuket pour ton aide mais ma table est déjà créé donc la colonne A,B,C
    sauf que j'ai ajouté la colonne combinaison pour affecter des valeurs .
    Les valeurs existent déjà dans la colonne A,B,C mais elles sont pas stocké par ordre.
    donc ca peut de la façon suivante
    A B C
    1 1 null
    2 1 null
    1 nul null
    Et ainsi de suite.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Février 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 32
    Par défaut sqlserver
    le but c'est d'avoir c'est d'avoir dans la table uneTableDeQuatreColonnes 4 colonnes

    Valeurs stoké aléatoirement dans les colonnes A,B,C
    et Un compteur dans combinaison:

    A B C combinaison
    1 null 4 1
    1 1 null 2
    4 nul 1 3

    Etc

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Un compteur ?

    Quel serait le but de ce compteur et sur quel ordre se base-t-il ?

  6. #6
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Vous pouvez tronquer votre table pour la remplir avec la requête que je vous ai donné.

    Si vous avez besoin d'avoir un "ordre" aléatoire dans votre table, il suffit de changer en écrivant :

    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
    ;WITH
    	A AS
    	(
    		SELECT	1 AS A
    		UNION ALL SELECT 2
    		UNION ALL SELECT 3
    		UNION ALL SELECT 4
    	)
    	, B AS
    	(
    		SELECT	1 AS B
    		UNION ALL SELECT 2
    		UNION ALL SELECT 3
    		UNION ALL SELECT 4
    		UNION ALL SELECT NULL
    	)
    INSERT		dbo.uneTableDeQuatreColonnes
    SELECT		A.A
    		, B.B
    		, C.B
    		, ROW_NUMBER() OVER(ORDER BY NEWID()) AS compteur
    FROM		A AS A
    CROSS JOIN	B AS B
    CROSS JOIN	B AS C
    GO
    @++

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

Discussions similaires

  1. creer une base de donnees sous sql server express 2005
    Par brajae85 dans le forum Développement
    Réponses: 2
    Dernier message: 08/09/2008, 12h54
  2. Problème de procédure stockée sous SQL Server 2000.
    Par FabienDev dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 01/07/2008, 16h26
  3. Réponses: 9
    Dernier message: 19/03/2008, 19h52
  4. Procédures stockées SQL Server, récupération sous Delphi
    Par rophi dans le forum Bases de données
    Réponses: 10
    Dernier message: 03/12/2007, 14h48
  5. [PowerBuilder 10] Procédure stockée sous SQL Server 2000
    Par digital prophecy dans le forum Powerbuilder
    Réponses: 8
    Dernier message: 11/10/2006, 10h38

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