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 :

tester IF EXIST dans procédure stockée clause WITH


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 101
    Par défaut tester IF EXIST dans procédure stockée clause WITH
    Bonjour,

    Voici une procédure qui permet de remplir une table DATE avec tous les jours de l'année.

    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
    WITH calendar(date_calendar)
    AS
    (
    	SELECT CAST(cast(year(getdate())+1 AS varchar(4)) + '0101' AS datetime)
    	UNION ALL
    	SELECT DATEADD(dd,1,date_calendar)
    	FROM calendar
    	WHERE date_calendar < cast(cast(year(getdate())+1 AS varchar(4)) + '1231' AS datetime)
    )
    INSERT INTO [DW].[dbo].[Dim_Date]
               ([DATE_TIME]
    	,[JOUR]
               ,[MOIS]
               ,[ANNEE])
    SELECT 
    	date_calendar,
    	CAST(DAY(date_calendar) AS VARCHAR(2)),
    	CAST(MONTH(date_calendar) AS VARCHAR(2)),
    	CAST(YEAR(date_calendar) AS CHAR(4))
    FROM calendar
     
    OPTION (MAXRECURSION 365)
    Si la procédure est lancée plusieurs fois, je dois tester si l'enregistrement existe deja. Je n'arrive à rien, j'ai tester IF EXIST avec select...mais apparement dans le WITH ca ne marche pas.

    QQ'un a une idée??

    Merci d'avance

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Pourquoi en faire une procédure ?
    Remplissez une fois votre table calendrier sur une période qui vous convient (de 1960 à 2100 par exemple) et gardez le script.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OPTION (MAXRECURSION 365)
    Vous n'aimez pas les années bissextiles ?

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 101
    Par défaut
    Car c'est une procédure que je lance chaque année, c'est demandée..

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Citation Envoyé par brasco06 Voir le message
    Car c'est une procédure que je lance chaque année, c'est demandée..
    J'essaye de vous faire comprendre que ça me paraît un peu absurde !

    Exécutez ce code :
    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
    WITH ANNEE(AN) AS
    (
        SELECT 1
        UNION ALL
        SELECT AN + 1
        FROM ANNEE
        WHERE AN < 90
    ),  CALENDAR(AN, DATE_CALENDAR)
    AS
    (
        SELECT AN, CAST(CAST(YEAR(GETDATE())+AN AS VARCHAR(4)) + '0101' AS DATETIME)
        FROM ANNEE
        UNION ALL
        SELECT AN, DATEADD(DD,1,DATE_CALENDAR)
        FROM CALENDAR
        WHERE DATE_CALENDAR < CAST(CAST(YEAR(GETDATE())+AN AS VARCHAR(4)) + '1231' AS DATETIME)
    )
    INSERT INTO [DW].[dbo].[Dim_Date]
               ([DATE_TIME]
               ,[JOUR]
               ,[MOIS]
               ,[ANNEE])
    SELECT 
        DATE_CALENDAR,
        CAST(DAY(DATE_CALENDAR) AS VARCHAR(2)),
        CAST(MONTH(DATE_CALENDAR) AS VARCHAR(2)),
        CAST(YEAR(DATE_CALENDAR) AS CHAR(4))
    FROM CALENDAR
    ORDER BY DATE_CALENDAR ASC
     
    OPTION (MAXRECURSION 366)
    Et vous serez tranquille jusqu'en 2100 !

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 101
    Par défaut
    Vous n'avez pas compris, Je ne dois PAS faire ce traitement à l'avance.

    Je dois le faire chaque année, c'est pour un ETL c'est spécial.

    D'ou mon besoin

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Vous travaillez comme vous voulez et vous portez les fardeaux que vous voulez bien porter.
    ETL ou pas, une table calendrier a le droit d'avoir plus qu'une année de donnée en elle.

    Bref, amusez-vous bien tous les ans !

    Pour votre soucis, il suffit de rajouter un where not exists :
    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 calendar(date_calendar)
    AS
    (
    	SELECT CAST(cast(year(getdate())+1 AS varchar(4)) + '0101' AS datetime)
    	UNION ALL
    	SELECT DATEADD(dd,1,date_calendar)
    	FROM calendar
    	WHERE date_calendar < cast(cast(year(getdate())+1 AS varchar(4)) + '1231' AS datetime)
    )
    INSERT INTO [DW].[dbo].[Dim_Date]
               ([DATE_TIME]
    	,[JOUR]
               ,[MOIS]
               ,[ANNEE])
    SELECT 
    	date_calendar,
    	CAST(DAY(date_calendar) AS VARCHAR(2)),
    	CAST(MONTH(date_calendar) AS VARCHAR(2)),
    	CAST(YEAR(date_calendar) AS CHAR(4))
    FROM calendar
    WHERE NOT EXISTS (SELECT NULL FROM [DW].[dbo].[Dim_Date] AS Dim2
                      WHERE Dim2.[DATE_TIME] = [DW].[dbo].[Dim_Date].[DATE_TIME])
     
    OPTION (MAXRECURSION 366)

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

Discussions similaires

  1. Procédure stockée : clause CASE dans mon WHERE ?
    Par ridokou dans le forum Développement
    Réponses: 5
    Dernier message: 27/05/2011, 13h55
  2. Alter table dans procédure stockée
    Par mehitabelle dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 30/11/2005, 16h14
  3. Réponses: 7
    Dernier message: 16/09/2005, 10h14
  4. procédures stockées dans procédure stockée
    Par olivc dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 30/05/2005, 16h58
  5. SQL dans Procédure stockée
    Par julure dans le forum Oracle
    Réponses: 13
    Dernier message: 02/11/2004, 16h57

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