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 :

petit probleme de syntaxe


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Février 2007
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 41
    Par défaut petit probleme de syntaxe
    bonjour a tous
    j ai un petit probleme de syntaxe avec une procedure stockee qui m empoisonne un projet
    j aimerai que quelqun vienne a mon aide
    merci d avance
    Msg d erreur dans sql management studio 2005 :

    Msg 102 Level 15 ,state 1 procedure cataloggetproductsonfrontpromo,line 20
    incorrect syntax near ')'

    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
    procedure stockee
     
     
     
    CREATE PROCEDURE CatalogGetProductsOnDeptPromo
    (@DepartmentID INT,
    @DescriptionLength INT,
    @PageNumber INT,
    @ProductsPerPage INT,
    @HowManyProducts INT OUTPUT)
    AS
    -- declare a new TABLE variable
    DECLARE @Products TABLE
    (RowNumber INT,
    ProductID INT,
    Name NVARCHAR(50),
    Description NVARCHAR(MAX),
    Price MONEY,
    Thumbnail NVARCHAR(50),
    Image NVARCHAR(50),
    PromoFront bit,
    PromoDept bit)
    -- populate the table variable with the complete list of products
    INSERT INTO @Products
    SELECT ROW NUMBER() OVER (ORDER BY ProductID) AS Row,
    ProductID, Name, SUBSTRING(Description, 1, @DescriptionLength)
    + '...' AS Description,
    Price, Thumbnail, Image, PromoFront, PromoDept
    FROM
    (SELECT DISTINCT Product.ProductID, Product.Name,
    CASE WHEN LEN(Product.Description) <= @DescriptionLength
    THEN Product.Description
    ELSE SUBSTRING(Product.Description, 1, @DescriptionLength) + '...' END
    AS Description, Price, Thumbnail, Image, PromoFront, PromoDept
    FROM Product INNER JOIN ProductCategory
    ON Product.ProductID = ProductCategory.ProductID
    INNER JOIN Category
    ON ProductCategory.CategoryID = Category.CategoryID
    WHERE Product.PromoDept = 1
    AND Category.DepartmentID = @DepartmentID

  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 : 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
    Bonjour,

    N'oubliez pas la balise code (bouton #) quand vous en publiez

    Votre erreur de syntaxe provient du fait que vous avez oublié l'underscore entre ROW et NUMBER(), la fonction étant donc ROW_NUMBER().

    Autres remarques :

    - Quel est l'intérêt de placer les données que vous recherchez dans une variable de type table ?
    Sachez que sur ce type de table, SQL Server ne maintient pas de statistiques, ce qui conduit à des plans de requête qui ne peuvent pas être optimaux puisque l'optimiseur se base sur ces statistiques pour établir un plan efficace.

    - Vous n'avez pas qualifié le nom des tables qui participent à votre requête par le nom du schéma auquel elles appartiennent, qui est par défaut dbo (mais ce n'est pas forcément le cas )
    Cela oblige SQL Server à interroger les tables de métadonnées pour connaître le propriétaire de la table et le comparer à celui qui exécute votre procédure stockée pour savoir s'il en a le droit d'exécution, ou autres privilèges.

    - Vous n'avez pas placé l'option SET NOCOUNT à ON dans votre procédure stockée, ce qui retourne donc le nombre de lignes affectées par les requêtes de votre procédure stockée à l'appelant.
    Cela n'est pas une grosse source de problèmes de performance, mais ça ne coûte rien de le mettre

    Voici donc un exemple de ce que pourrait être votre procédure stockée, en tenant compte du fait que j'ai laissé la variable de type table car je ne sais pas ce que vous en faites par la suite ...
    Je suis certain que vous pouvez vous en passer

    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
    CREATE PROCEDURE CatalogGetProductsOnDeptPromo
    	@DepartmentID INT,
    	@DescriptionLength INT,
    	@PageNumber INT,
    	@ProductsPerPage INT,
    	@HowManyProducts INT OUTPUT
    AS
    BEGIN
    	-- declare a new TABLE variable
    	DECLARE @Products TABLE
    	(
    		RowNumber INT,
    		ProductID INT,
    		Name NVARCHAR(50),
    		Description NVARCHAR(MAX),
    		Price MONEY,
    		Thumbnail NVARCHAR(50),
    		Image NVARCHAR(50),
    		PromoFront bit,
    		PromoDept bit
    	)
     
    	-- populate the table variable with the complete list of products
    	INSERT INTO @Products 
    	SELECT ROW_NUMBER() OVER (ORDER BY ProductID) AS Row
    		, ProductID
    		, Name
    		, SUBSTRING(Description, 1, @DescriptionLength) + '...' AS Description
    		, Price
    		, Thumbnail
    		, Image
    		, PromoFront
    		, PromoDept
    	FROM
    	(
    		SELECT DISTINCT P.ProductID
    				, P.Name,
    				CASE
    					WHEN LEN(P.Description) <= @DescriptionLength THEN Product.Description
    					ELSE SUBSTRING(P.Description, 1, @DescriptionLength) + '...'
    				END AS Description
    				, Price
    				, Thumbnail
    				, Image
    				, PromoFront
    				, PromoDept
    		FROM		dbo.Product AS P
    		INNER JOIN	dbo.ProductCategory AS PC
    					ON P.ProductID = PC.ProductID
    		INNER JOIN	dbo.Category AS C
    					ON PC.CategoryID = C.CategoryID
    		WHERE		P.PromoDept = 1
    		AND		C.DepartmentID = @DepartmentID
    	) AS TMP
    END
    @++

  3. #3
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Par défaut
    Merci de ne pas oublier de marquer résolu le poste.

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

Discussions similaires

  1. Requete petite probleme de syntaxe
    Par mihaispr dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 07/11/2009, 13h08
  2. Création d'un module : petit probleme de syntaxe
    Par sebinator dans le forum VBA Access
    Réponses: 2
    Dernier message: 30/11/2007, 11h10
  3. Petit probleme de syntaxe
    Par pooi1 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 26/06/2007, 11h47
  4. petit probleme de syntaxe
    Par kiss78 dans le forum Langage
    Réponses: 3
    Dernier message: 05/06/2006, 12h21
  5. petit probleme dans une requte POSTGRE SQL
    Par ghis le fou dans le forum Requêtes
    Réponses: 5
    Dernier message: 08/09/2003, 13h51

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