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 :

Erreur : La variable scalaire "@variable" doit être déclarée


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Points : 11
    Points
    11
    Par défaut Erreur : La variable scalaire "@variable" doit être déclarée
    Bonjour,

    Désolé, la question est très certainement triviale mais je suis codeur SQL ...le dimanche et je ne vois pas.

    J'obtiens le message d'erreur en titre, bien que mon code contienne bien une instruction DECLARE.

    Quelques détails :

    Environnement MS-SQL 2005 sous éditeur Management Studio.
    Je cherche à créer une vue avec deux dates en variables pour pouvoir obtenir différents champs et calculs de valeurs de stock en fonction d'une date initiale et une date finale de période.

    L"idée est de pouvoir changer ces bornes très rapidement sans toucher le reste du code.

    La requête est pour l'instant très simple, mais hormis ce problème de variable le reste ne devrais pas poser de problème. C'est pourquoi je teste cette partie.

    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
    USE [POWER_SBO]
    GO
    /****** Objet*:  View [dbo].[E_S_DATE]    Date de génération du script*: 09/22/2013 13:02:27 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    DECLARE @InitDate Datetime
    DECLARE @FinalDate Datetime
    SET @InitDate = '01.04.2012'
    SET @FinalDate = '31.03.2013'
    GO
    ALTER VIEW [dbo].[E_S_DATE]
    AS
    SELECT     ItemCode, InQty, OutQty, DocDate
    FROM         dbo.ES
    WHERE     (ItmsGrpCod = '110') AND (DocDate BETWEEN @InitDate AND @FinalDate)
    Je me suis limité à ajouter les lignes 7 à 10

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DECLARE @InitDate Datetime
    DECLARE @FinalDate Datetime
    SET @InitDate = '01.04.2012'
    SET @FinalDate = '31.03.2013'
    et à remplacer les deux dates dans la clause WHERE par les variables dans la vue créée par Management Studio qui elle, fonctionne.

    merci à qui me mettra sur la piste.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    on ne met pas de variable dans une vue (ou alors j'ai loupé un truc ..)

    Ensuite pour la démarche, si votre vue n'est pas trop complexe votre clause where devrait changer le plan d’exécution de votre requête.

    Si votre requête est complexe il faudra passer par une fonction (ou équivalent sur sql serveur) afin de remonter suffisamment les paramètres dans le plan d'exec de la requête.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Points : 11
    Points
    11
    Par défaut
    on ne met pas de variable dans une vue
    A la réflexion, c'est en effet un peu tard, mais en pratique au faut-il le faire ?

    Pour le reste de vos commentaires j'avoue que la formulation est très nébuleuse pour moi.
    Je vais avoir plusieurs clauses WHERE (requêtes imbriquées) pour obtenir un stock en début de période, des totaux Entrées/Sorties sur la période et un Stock en fin de période. Rien de très complexe me semble-t-il.

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    quelle est la requête ? et mettez vos variables dedans.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Points : 11
    Points
    11
    Par défaut
    Pour moi une Vue est une requête enregistrée.

    Pour expliquer un peu mieux la situation :
    Un base SAP (SBO) que je ne suis pas autorisé à toucher.
    J'ai donc créer une autre Base POWER_SBO dans laquelle je requête les tables d'origine par des Vues.

    La Vue dbo.ES contient les données que je veux traiter. Et la Vue de mise en forme sur laquelle je souhaite mettre mes conditions de dates est [dbo].[E_S_DATE].

    Je ne travaille donc que sur des Vues. Si on ne peut déclarer de variables dans une Vue, ce qui semble être le cas car mes ajouts ne génèrent pas d'erreur mais ne sont pas conservés par l'éditeur, alors où puis-je le faire ?

    Merci encore pour votre aide.

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Si je reprend votre exemple.

    Vous créez la vue suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CREATE VIEW MA_VUE AS 
    SELECT     ItemCode, InQty, OutQty, DocDate
    FROM         dbo.ES
    Ensuite vous pouvez la requeter de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT ItemCode, InQty, OutQty, DocDate
    FROM MA_VUE
    WHERE ItemCode = ? AND DocDate between(?, ?)
    Les "?" sont à remplacer par vos variables.

    Sur des vues simple comme celle-ci SQL serveur va, sans problème, faire remonter les paramètres et ne selectionnera que les données souhaitées.


    PAr contre si vos vues sont du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    WITH TMP AS (SELECT ..... FROM ... WHERE .... GROUP BY ...),
    TMP2 AS (SELECT .... FROM .. WHERE ma_cond = ?)
     
    SELECT ..
    FROM TMP
    INNER JOIN TMP2 ON ..
    Et que vos paramètres doivent etre placer dans les CTE (ce que j'appellerai une vue complexe), alors il vaudrait mieux passer par des fonctions, qui elles prennent des paramètres d'entrée.. http://msdn.microsoft.com/fr-fr/library/ms186755.aspx


    Le but étant au final de ne pas faire écrouler votre instance SqlServeur..

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Points : 11
    Points
    11
    Par défaut
    Réponse B pour le niveau de complexité je crois !

    Au final je me suis débrouillé avec une Vue telle que celle-ci
    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
    SELECT     TOP (100) PERCENT dbo.OITM.ItemCode AS Article, dbo.OITB.ItmsGrpNam AS [Groupe Article], dbo.OITM.LstEvlPric AS 'Dernier prix déterminé', 
                          SI.InitStock AS 'Stock Initial', ESDAD.SumIn AS 'Entrées', MVF.SumInF AS 'Livraisons Fournisseurs', ESDAD.SumOut AS 'Sorties', 
                          MVF.SumOutF AS 'Retours Fournisseurs', SF.FinalStock AS 'Stock Final'
    FROM         dbo.OITM INNER JOIN
                          dbo.OITB ON dbo.OITB.ItmsGrpCod = dbo.OITM.ItmsGrpCod LEFT OUTER JOIN
                              (SELECT     TOP (100) PERCENT ItemCode, SUM(InQty) - SUM(OutQty) AS InitStock
                                FROM          dbo.ES AS ESI
                                WHERE      (ItmsGrpCod = '110') AND (DocDate < '01.04.2013')
                                GROUP BY ItemCode) AS SI ON dbo.OITM.ItemCode = SI.ItemCode LEFT OUTER JOIN
                              (SELECT     TOP (100) PERCENT ItemCode, SUM(InQty) AS SumIn, SUM(OutQty) AS SumOut
                                FROM          dbo.ES
                                WHERE      (ItmsGrpCod = '110') AND (DocDate BETWEEN '01.04.2013' AND '30.09.2013')
                                GROUP BY ItemCode) AS ESDAD ON dbo.OITM.ItemCode = ESDAD.ItemCode LEFT OUTER JOIN
                              (SELECT     TOP (100) PERCENT ItemCode, SUM(InQty) AS SumInF, SUM(OutQty) AS SumOutF
                                FROM          dbo.ES AS ESF
                                WHERE      (ItmsGrpCod = '110') AND (DocDate BETWEEN '01.04.2013' AND '30.09.2013') AND (TransType = '18' OR
                                                       TransType = '19' OR
                                                       TransType = '20' OR
                                                       TransType = '21')
                                GROUP BY ItemCode) AS MVF ON dbo.OITM.ItemCode = MVF.ItemCode INNER JOIN
                              (SELECT     TOP (100) PERCENT ItemCode, SUM(InQty) - SUM(OutQty) AS FinalStock
                                FROM          dbo.ES AS ESF
                                WHERE      (ItmsGrpCod = '110') AND (DocDate < '30.09.2013')
                                GROUP BY ItemCode) AS SF ON dbo.OITM.ItemCode = SF.ItemCode
    ORDER BY Article
    Que je "requête" à partir d'Excel. Mais il me faut changer les dates à la main dans Management Studio.

    Il faudra que je me penche sur la solution d'une fonction ultérieurement, c'est la dure vie d'un factotum de l'informatique ;-)

    merci pour les conseils.

Discussions similaires

  1. Erreur La variable scalaire "@var" doit être déclarée.
    Par sawnet dans le forum Développement
    Réponses: 1
    Dernier message: 21/11/2012, 10h40
  2. Réponses: 2
    Dernier message: 31/05/2011, 12h12
  3. Réponses: 5
    Dernier message: 14/11/2006, 09h14

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