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 :

Utilisation des variable dans SQL Server 2012


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Informatique
    Inscrit en
    Janvier 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 20
    Par défaut Utilisation des variable dans SQL Server 2012
    Bonjour,

    Je souhaiterais savoir comment utilisé un if EXISTS avec des variables?
    Je m'explique:
    j'ai cette requête (ci-dessous) qui s’exécute dans une procédure stockée


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if EXISTS (SELECT * FROM DATA.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = @DestinationSchema AND TABLE_NAME = @DestinationTable).
    DATA est la base de données.

    Je souhaiterais modifier cette requête pour utiliser @localBase à la place de DATA, car j'en ai d'autres bases.

    On m'a dit qu'il faut utilisé une variable pour exécuter la requête puis mettre le résultat dans une variable et applique l'exec. A la fin faire le IF EXISTS.

    Mais je n'y arrive pas.

    Pourriez-vous m'aider svp c'est très urgent.

    Je vous remercie par avance.

    Slim025

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 002
    Billets dans le blog
    6
    Par défaut
    Il faut faire du SQL dynamique.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    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,

    Effectivement : vous pouvez construire la chaîne de requête en la paramétrant, sauf pour la base de données.
    Ensuite il suffit de soumettre la chaîne paramétrée à l'aide de la procédure stockée système sp_executesql :

    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
    DECLARE @database nvarchar(128) = 'maBD'
    	, @ok bit
    	----
    	, @destination_schema nvarchar(128) = 'monSchema'
    	, @destination_table nvarchar(128) = 'maTable'
     
    DECLARE @sql nvarchar(max) = '
    IF EXISTS
    (
    	SELECT	*
    	FROM	' + @database + '.INFORMATION_SCHEMA.TABLES
    	WHERE	TABLE_SCHEMA = @_destination_schema
    	AND	TABLE_NAME = @_destination_table
    )
    SET @_ok = 1
    ELSE SET @_ok = 0'
     
    EXEC sp_executesql
    	@sql
    	, N'@_ok bit OUTPUT, @_destination_schema nvarchar(128), @_destination_table nvarchar(128)'
    	, @_destination_schema = @destination_schema
    	, @_destination_table = @destination_table
    	, @_ok = @ok OUTPUT
     
    SELECT @ok
    Vous pouvez transmettre le tout directement à SQL Server depuis l'application, ou aller un peu plus loin et encapsuler le tout dans une procédure stocké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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    CREATE PROCEDURE p_table_exists_in_database_schema
    	@database nvarchar(128)
    	, @destination_schema nvarchar(128)
    	, @destination_table nvarchar(128)
    AS
    BEGIN
    	SET NOCOUNT ON
     
    	DECLARE @table_exists bit
    		, @sql nvarchar(max) = '
    	IF EXISTS
    	(
    		SELECT	*
    		FROM	' + @database + '.INFORMATION_SCHEMA.TABLES
    		WHERE	TABLE_SCHEMA = @_destination_schema
    		AND	TABLE_NAME = @_destination_table
    	)
    	SET @_ok = 1
    	ELSE SET @_ok = 0'
     
    	EXEC sp_executesql
    		@sql
    		, N'@_ok bit OUTPUT, @_destination_schema nvarchar(128), @_destination_table nvarchar(128)'
    		, @_destination_schema = @destination_schema
    		, @_destination_table = @destination_table
    		, @_ok = @table_exists OUTPUT
     
    	SELECT @database AS database_name
    		, @destination_schema AS [schema_name]
    		, @destination_table AS table_name
    		, @table_exists AS table_exists
     
    	/* -- Ou plus simplement :
    	SELECT @table_exists AS table_exists
    	*/
    END
    Dès lors l'appel est très simplifié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    EXEC dbo.p_table_exists_in_database_schema
    	'maBD'
    	, 'monSchema'
    	, 'maTable'
    Et si un jour vous devez changer le code de la procédure stockée, nul besoin de recompiler l'application tant que les paramètres d'entrée sont les mêmes et que la table retournée possède la même définition. L'exécution des procédures stockées est par ailleurs plus sécurisée et génère un trafic réseau bien plus faible que la chaîne de requête entière soumise au moteur. En revanche, avec la procédure stockée, vous ne pouvez pas (j'aimerai tellement avoir tort) disposer d'un contrôle de code source qui vous montre le code de l'application en même temps que celui des procédures stockées changées dans le même check-in.

    @++

  4. #4
    Membre averti
    Homme Profil pro
    Informatique
    Inscrit en
    Janvier 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 20
    Par défaut
    Bonjour,

    Je vous remercie pour votre participation et votre aide.

    Je vais essayer votre solution.
    J'aimerais juste rajouter la raison de ma question.

    En faite, je veux exécuter la même procédure sur 3 serveurs qui contiennent chacune 3 base de données.

    Je voudrais avoir la possibilité d'appeler la procédure avec des paramètre par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    DECLARE @RC int
    DECLARE @SourceServer nvarchar(255)
    DECLARE @database nvarchar(255)
     
    SET @SourceServer = 'Servername1,10000'
    SET @localbase = 'DATA'
     
    EXECUTE @RC = [dbo].[copyProd_Val] @SourceServer, @localbase
    GO
    Est-ce que vous pensez qu'il y a une possibilité de le faire?

    Je vous remercie pour votre aide.

    Bien cordialement.

    Slim025

  5. #5
    Membre averti
    Homme Profil pro
    Informatique
    Inscrit en
    Janvier 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 20
    Par défaut
    Bonjour elsuket,

    Pourriez-vous m'expliquer le but de la variable @ok bit. Désolé, je n'ai pas bien compris votre logique
    Par ce que moi je me demandais si on ne peux pas faire ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SET @SQL = 'SELECT * FROM [' + @localBase + '].INFORMATION_SCHEMA.TABLES
    			   WHERE TABLE_SCHEMA = [' + @DestinationSchema + '] AND TABLE_NAME = [' + @DestinationTable + ']'
    EXEC sp_executesql @SQL
    PUIS faire le TEST Mais je ne sais pas comment faire!!!!

    Je vous remercie par avance.

    Bien cordialement

    Slim025

    Citation Envoyé par elsuket Voir le message
    Bonjour,

    Effectivement : vous pouvez construire la chaîne de requête en la paramétrant, sauf pour la base de données.
    Ensuite il suffit de soumettre la chaîne paramétrée à l'aide de la procédure stockée système sp_executesql :

    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
    DECLARE @database nvarchar(128) = 'maBD'
    	, @ok bit
    	----
    	, @destination_schema nvarchar(128) = 'monSchema'
    	, @destination_table nvarchar(128) = 'maTable'
     
    DECLARE @sql nvarchar(max) = '
    IF EXISTS
    (
    	SELECT	*
    	FROM	' + @database + '.INFORMATION_SCHEMA.TABLES
    	WHERE	TABLE_SCHEMA = @_destination_schema
    	AND	TABLE_NAME = @_destination_table
    )
    SET @_ok = 1
    ELSE SET @_ok = 0'
     
    EXEC sp_executesql
    	@sql
    	, N'@_ok bit OUTPUT, @_destination_schema nvarchar(128), @_destination_table nvarchar(128)'
    	, @_destination_schema = @destination_schema
    	, @_destination_table = @destination_table
    	, @_ok = @ok OUTPUT
     
    SELECT @ok
    Vous pouvez transmettre le tout directement à SQL Server depuis l'application, ou aller un peu plus loin et encapsuler le tout dans une procédure stocké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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    CREATE PROCEDURE p_table_exists_in_database_schema
    	@database nvarchar(128)
    	, @destination_schema nvarchar(128)
    	, @destination_table nvarchar(128)
    AS
    BEGIN
    	SET NOCOUNT ON
     
    	DECLARE @table_exists bit
    		, @sql nvarchar(max) = '
    	IF EXISTS
    	(
    		SELECT	*
    		FROM	' + @database + '.INFORMATION_SCHEMA.TABLES
    		WHERE	TABLE_SCHEMA = @_destination_schema
    		AND	TABLE_NAME = @_destination_table
    	)
    	SET @_ok = 1
    	ELSE SET @_ok = 0'
     
    	EXEC sp_executesql
    		@sql
    		, N'@_ok bit OUTPUT, @_destination_schema nvarchar(128), @_destination_table nvarchar(128)'
    		, @_destination_schema = @destination_schema
    		, @_destination_table = @destination_table
    		, @_ok = @table_exists OUTPUT
     
    	SELECT @database AS database_name
    		, @destination_schema AS [schema_name]
    		, @destination_table AS table_name
    		, @table_exists AS table_exists
     
    	/* -- Ou plus simplement :
    	SELECT @table_exists AS table_exists
    	*/
    END
    Dès lors l'appel est très simplifié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    EXEC dbo.p_table_exists_in_database_schema
    	'maBD'
    	, 'monSchema'
    	, 'maTable'
    Et si un jour vous devez changer le code de la procédure stockée, nul besoin de recompiler l'application tant que les paramètres d'entrée sont les mêmes et que la table retournée possède la même définition. L'exécution des procédures stockées est par ailleurs plus sécurisée et génère un trafic réseau bien plus faible que la chaîne de requête entière soumise au moteur. En revanche, avec la procédure stockée, vous ne pouvez pas (j'aimerai tellement avoir tort) disposer d'un contrôle de code source qui vous montre le code de l'application en même temps que celui des procédures stockées changées dans le même check-in.

    @++

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/07/2009, 10h33
  2. Utiliser des variables dans les noms d'objet
    Par Torkan dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 15/03/2007, 23h54
  3. Comment utiliser des variables dans une requête SQL ?
    Par Ragnarok85 dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 12/02/2007, 16h23
  4. Utiliser des variables dans un parsing
    Par blackj dans le forum Langage
    Réponses: 1
    Dernier message: 15/12/2006, 22h04
  5. Importer des données dans sql server avec DELPHI ???
    Par moutanakid dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/08/2004, 17h22

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