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 :

Besoin de conseil fonction insert (MS SQL)


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 33
    Par défaut Besoin de conseil fonction insert (MS SQL)
    salut tout le monde

    J'ai besoin d'aide ...

    Je souhaiterais crée un tableau qui contient deux colonnes (ex: val1, val2)

    j'utilise pour cela la fonction insert :


    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
    SET NOCOUNT ON 
    	DECLARE @StartDate DateTime 
    	DECLARE @val2 table(poste1 real,poste2 real);
    	DECLARE @EndDate DateTime 
    	DECLARE @IdxDate DateTime
     
    	SET @StartDate = STR(year(GETDATE())) + '/' + STR(month(GETDATE())) + '/' + '01'
    	SET @IdxDate = @StartDate
    	SET @EndDate = STR(year(GETDATE())) + '/' + STR(month(GETDATE())) + '/' + STR(day(GETDATE()))
    SET NOCOUNT OFF
     
    WHILE @IdxDate <= @EndDate 
    BEGIN
     
    	INSERT INTO @val2 (poste1)
    	SELECT Sum(StateTime)/3600000 as Tempo
    	FROM Runtime.dbo.History 
    	WHERE TagName IN ('SysPulse') 
    	AND Value = 1 
    	AND wwRetrievalMode = 'ValueState'
    	AND wwStateCalc = 'Total'
    	AND wwCycleCount = 100 
    	AND wwVersion = 'Latest'
    	AND DateTime >= @IdxDate +' 05:00:00'
        AND DateTime < STR(year(@IdxDate)) + '/' + STR(month(@IdxDate)) + '/' + STR(day(@IdxDate+1))+' 13:00:00'
     
    	INSERT INTO @val2 (poste2) 
    	SELECT Sum(StateTime)/3600000 as Tempo
    	FROM Runtime.dbo.History 
    	WHERE TagName IN ('SysPulse') 
    	AND Value = 1 
    	AND wwRetrievalMode = 'ValueState'
    	AND wwStateCalc = 'Total'
    	AND wwCycleCount = 100 
    	AND wwVersion = 'Latest'
    	AND DateTime >= @IdxDate +' 13:00:00'
        AND DateTime < STR(year(@IdxDate)) + '/' + STR(month(@IdxDate)) + '/' + STR(day(@IdxDate+1))+' 21:00:00'
     
     
     
    	IF @IdxDate >= @EndDate
    	BREAK
       ELSE
    	SET @IdxDate = DateAdd(dd,1,@IdxDate)
    	CONTINUE
    END	
     
    select * from @val2

    Le resultat que j'obtiens est presque celui que je recherche, mais le problème est que le resultat du premier insert n'est pas sur la même ligne que le resultat du second...


    Avez vous une idée ?

    Merci

  2. #2
    Membre éprouvé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2002
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2002
    Messages : 98
    Par défaut
    C'est tout à fait normal: si vous faites 2 inserts il y a deux lignes créées.

    Il faut faire un seul insert des deux valeurs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO @val2 (poste1,poste2)
    SELECT Sum(a.StateTime)/3600000,
               Sum(b.StateTime)/3600000
    FROM Runtime.dbo.History a, Runtime.dbo.History  b
    WHERE ...
    ou insérer une valeur puis faire un update pour mettre la deuxième valeur. Mais vu qu'il n'y a pas de pk dans votre table ça risque d'être difficile de savoir quelle ligne il faut mettre à jour.

  3. #3
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 33
    Par défaut
    Salut à tous

    Merci pour ta réponse et au modérateur d'avoir déplacer mon sujet au bon endroit

    Je test et je vous donne mon feedback

  4. #4
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 33
    Par défaut
    Re bon et bien j'ai testé mais je ne parviens pas à faire mieux.

    Enfin si, en méttant le tout dans un INSERT commun, mais le problème est que la condition du SELECT reste la même se qui fais que je remplis bien les deux colones mais avec les même valeur.


    Se que je souhaite c'est crée un tableau ou je renseigne le temps de fonctionnement d'un moteur mais pour 2 plages horaires diférentes :5h-13h,13h-21h


    Donc la seul condition qui change c'est la plage de temps ...

    Pouvez vous me dire comment crée un INSERT semblable à celui donné précédement, ou je met deux plages de temps différents ?

    Merci d'avance

  5. #5
    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 : 44
    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
    Bonsoir,

    Amusez-vous avec la puissance des expressions de table commune introduites avec SQL Server 2005 :

    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
    DECLARE @dateDeb DATETIME,
    	@dtToday DATETIME,
    	@heureDeb TINYINT,
    	@heureMil TINYINT,
    	@heureFin TINYINT;
     
    SELECT @dateDeb = DATEADD(day, -DAY(GETDATE()), CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)),
    	@dtToday = CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME),
    	@heureDeb = 5,
    	@heureMil = 13,
    	@heureFin = 21;
     
    WITH
    	-- Crée la liste des plages horaires entre la date de début et ce matin à minuit
    	-- sous la forme 2008-09-30 05:00:00.000 | 2008-09-30 13:00:00.000 | 2008-09-30 21:00:00.000
    	-- pour tous les jours compris entre ces deux dates
    	CTE_TranchesHoraires (DateDeb, DateMil, DateFin) AS
    	(
    			SELECT DATEADD(hour, @heureDeb, @dateDeb), -- DateDeb
    				DATEADD(hour, @heureMil, @dateDeb), -- DateMil
    				DATEADD(hour, @heureFin, @dateDeb) -- DateFin
    		UNION ALL
    			SELECT DATEADD(day, 1, DateDeb), -- DateDeb
    				DATEADD(day, 1, DateMil), -- DateMil
    				DATEADD(day, 1, DateFin) -- DateFin
    			FROM CTE_TranchesHoraires
    			WHERE DateFin < @dtToday
    	),
    	-- Effectue le calcul du temps de fonctionnement du moteur pendant la première plage horaire
    	CTE_Poste1 (Tempo) 
    	(
    		SELECT SUM(StateTime)/3600000 -- Tempo
    		FROM Runtime.dbo.History 
    		WHERE TagName = 'SysPulse'
    		AND Value = 1 
    		AND wwRetrievalMode = 'ValueState'
    		AND wwStateCalc = 'Total'
    		AND wwCycleCount = 100 
    		AND wwVersion = 'Latest'
    		AND DateTime BETWEEN CTE_TranchesHoraires.DateDeb AND CTE_TranchesHoraires.DateMil
    	),
    	-- Effectue le calcul du temps de fonctionnement du moteur pendant la deuxième plage horaire
    	CTE_Poste2(Tempo)
    	(
    		SELECT SUM(StateTime)/3600000 -- Tempo
    		FROM Runtime.dbo.History 
    		WHERE TagName = 'SysPulse'
    		AND Value = 1 
    		AND wwRetrievalMode = 'ValueState'
    		AND wwStateCalc = 'Total'
    		AND wwCycleCount = 100 
    		AND wwVersion = 'Latest'
    		AND DateTime BETWEEN CTE_TranchesHoraires.DateMil AND CTE_TranchesHoraires.DateFin
    	)
    SELECT CTE_Poste1.Tempo,
    	CTE_Poste2.Tempo;
    Votre requête finale devient alors très simple

    Transformez-la éventuellement en une procédure stockée qui prend tous vos paramètres. De cette façon vous n'aurez ensuite qu'à effectuer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    EXEC dbo.maProcedure
    	@dateDeb = @dtDeb,
    	@dtToday = @dtJour,
    	@heureDeb = 5,
    	@heureMil = 13,
    	@heureFin = 21,
    	@TagName = 'SysPulse',
    	@Value = 1,
    	@wwRetrievalMode = 'ValueState',
    	@wwStateCalc = 'Total',
    	@wwCycleCount = 100,
    	@wwVersion = 'Latest'
    Veillez à l'indexation correcte de Runtime.dbo.History

    A+

  6. #6
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 33
    Par défaut
    Si c'est pas magique tout ça !!!!

    T'es un chez merci

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

Discussions similaires

  1. Insertion de date & Fonction "CAST" de SQL
    Par fedexpress dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 28/10/2009, 14h59
  2. besoin de conseil viabilité d'une fonction
    Par marie33000 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/06/2009, 14h49
  3. Besoin de conseil concernant cette requête SQL
    Par loic20h28 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 30/01/2009, 09h36
  4. besoin de conseils ouvrages SQL Server
    Par ctobini dans le forum Développement
    Réponses: 7
    Dernier message: 07/08/2008, 13h45
  5. [SQL] SQL syntax error dans fonction insert into
    Par scarfesse dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 21/12/2007, 13h25

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