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 :

Nombre de paramètres variables sql server 2008


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 105
    Points : 40
    Points
    40
    Par défaut Nombre de paramètres variables sql server 2008
    Bonjour

    Comment créer une procédure stockée avec un nombre variable de paramètres sans utiliser de variable de type table ?
    Je dois faire une procédure stockée qui reçoit des informations d'un formulaire, mais je ne sais pas combien d'informations l'utilisateur a rempli, et cela peut varier d'un user à l'autre ...

    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Il suffit pour cela de créer une table avec :

    - une colonne de type uniqueidentifier
    - une colonne de type entier
    - une colonne de type datetime avec une contrainte de valuation par défaut à GETDATE()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE session_values
    (
    	session_id uniqueidentifier NOT NULL
    	, value int NOT NULL
    	, log_date_time datetime NOT NULL CONSTRAINT DF_session_values__log_date_time DEFAULT GETDATE()
    )
    GO
    Vous réalisez l'INSERT dans cette table avec vos valeurs, en valuant la colonne session_id à NEWID(), que vous collectez au préalable dans une variable, et que vous spécifiez dans la clause SELECT de l'INSERT. Il suffit ensuite de faire la jointure entre la table dbo.session_values et la table adéquate dans votre base de données, en filtrant sur ce session_id.

    Si vous avez un gros besoin d'utilisation de cette table, veillez à la partitionner sur une colonne calculée dont la définition est ABS(CHECKSUM(session_id)) % <nombre de partitions>.

    Enfin, il faut mettre en place un job de nettoyage de cette table, aux heures de faible trafic, qui réalise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DELETE FROM dbo.session_values
    WHERE log_date_time < DATEADD(day, -1, GETDATE())
    Ceci de façon à avoir une table ayant une taille raisonnable, tout en évitant de supprimer les lignes pour des sessions en cours d'exécution.

    @++

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 105
    Points : 40
    Points
    40
    Par défaut
    Bonjour,

    Merci pour la réponse

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 105
    Points : 40
    Points
    40
    Par défaut
    Bonjour,

    Peut on mettre une requête contenant un IN dans une chaine de caractère? (afin de l'exécuter ensuite avec EXEC).
    Comment faire? Ma requête avec IN ne passe pas.
    Est-ce à cause des parenthèses?

    Merci

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 105
    Points : 40
    Points
    40
    Par défaut
    Voici ma requête au cas ou :

    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
    CREATE PROCEDURE [dbo].[research]
    	-- Add the parameters for the stored procedure here
    	@id int,
    	@p1 nvarchar (50),
    	@p2 nvarchar (50)
    AS
    BEGIN
     
    	declare @result nvarchar(50)
    	DECLARE @request nvarchar(MAX) = 'SELECT DISTINCT AC.name, AC.firstname FROM ACT AS AC, USER AS US, USER_L AS USL
    									  WHERE AC.id = US.id'
     
    	DECLARE c1 CURSOR FOR 
        SELECT name FROM RESEARCH WHERE id = @id
        OPEN c1
        FETCH  c1 INTO @result 
    	WHILE @@FETCH_STATUS = 0
    		BEGIN
    			IF (@result = 'exp')	 
    				 SET @request = @request  + ' AND USL.id IN(SELECT id FROM L WHERE name LIKE ( ''% '+@p1+' %'' ) )
    				 OR AC.name LIKE (''% '+@p1+' %'')'
    			IF (@result = 'lan')	 
    				 SET @request = @request  + ' AND AC.name LIKE ''%'+@p2+'%'''
    		FETCH NEXT FROM c1 INTO @result
    		END		 
    	CLOSE c1
    	DEALLOCATE c1
        EXECUTE (@request);  
     
    END
    Voyez vous une erreur?
    Je précise que lorsque j'écris la requête sans la chaine de caractère et sans variables, mais avec des mots en dur, elle passe, donc ce n'est pas un problème d'erreur dans la requête, mais autre chose qui m'échappe...

    Please ...

    Dev

  6. #6
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par Devlin111 Voir le message
    Peut on mettre une requête contenant un IN dans une chaine de caractère? (afin de l'exécuter ensuite avec EXEC).
    Comment faire? Ma requête avec IN ne passe pas.
    Oui, on peut (avec une requête dynamique et appel à EXEC ou sp_executesql), mais j'aurais tendance à dire que c'est à proscrire pour tout un tas de raisons...


    Citation Envoyé par Devlin111 Voir le message
    Voici ma requête au cas ou :
    (...)
    Voyez vous une erreur?
    D'une manière générale, un petit "PRINT @request" aide souvent à identifier le problème.


    Dans ton cas particulier, je dirais que ça provient très probablement d'un problème de précedence des opérateurs AND et OR (ajoute des parenthèses).

    Ou sinon (problème fréquent avec ce type de requêtes), tu rencontres peut-être des variables NULL (et quand tu essayes de concaténer une chaine de caractères avec NULL, ça donne NULL)

  7. #7
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    +1 pour l'affichage de la requête, ça aide beaucoup de la lire / de l'exécuter soi-même.

    Sinon, avoir le message d'erreur aiderait, parce que "ne passe pas" est peu explicite

    Une possibilité est la requête est trop grande. Vous êtes sûr qu'il n'y a pas 10000 résultats sur le cursor ? Vu le traitement, rajouter un DISTINCT semblerait idoine pour être sûr de ne pas mettre des conditions en N exemplaires.

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/04/2013, 02h06
  2. Réponses: 3
    Dernier message: 04/04/2012, 07h27
  3. [SQL SERVER 2008] Passer une variable à un requete.
    Par lerieure dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 19/01/2011, 22h24
  4. [SQL SERVER 2008] Variable dans la clause IN
    Par kh424 dans le forum Développement
    Réponses: 4
    Dernier message: 13/01/2011, 01h01
  5. SQL SERVER 2008 : Durée d'exécution variable - requête SQL
    Par zinzineti dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 29/03/2010, 17h19

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