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 :

Variable dans un script SQL


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 624
    Points : 69
    Points
    69
    Par défaut Variable dans un script SQL
    Bonjour,

    Je commence à développer en sql et je souhaiterai récupérer la valeur de mon servername, pour l'utiliser dans une autre variable pour créer ma proc stock

    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
     
     
    declare @NomServeur varchar(1000)
    set @NomServeur = 'select @@SERVERNAME'
    print @NomServeur
    EXEC (@NomServeur)
     
    --Utiliser le résultat de l exec pour le placer en variable lors de la création de ma ps
     
    CREATE PROCEDURE sp_SetTransactionLogMarkAll
    @name nvarchar (128)
    AS
    BEGIN TRANSACTION
    EXEC [$$@NomServeur].Tfs_Configuration.dbo.sp_SetTransactionLogMark @name
     
    COMMIT TRANSACTION
    GO
    Comment faire ?
    Merci pour votre aide

  2. #2
    Invité
    Invité(e)
    Par défaut
    Pour faire ça, vous devrez utiliser du SQL Dynamique - faites une recherche sur MSDN et vous aurez tous les détails.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set @NomServeur = 'select @@SERVERNAME'
    Ça marchera pas mais faites plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select @NomServeur = @@SERVERNAME
    ou 
    set @NomServeur = ( select @@SERVERNAME )

  3. #3
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    select @NomServeur = @@SERVERNAME
    ou
    set @NomServeur = ( select @@SERVERNAME )
    Encore plus simple je pense à partir de 2008

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DECLARE @NomServer sysname = @@SERVERNAME
    ++

  4. #4
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 624
    Points : 69
    Points
    69
    Par défaut
    Est cette requête peut fonctionner, ensachant que je veux récupérer la valeur @NomServeur pour la mettre dans l execution de la PS.

    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
     
    CREATE PROCEDURE sp_SetTransactionLogMarkAll
     
    @name nvarchar (128)
    declare @NomServeur varchar(1000)
    set @NomServeur = ( select @@SERVERNAME ) 
     
     
    AS
    BEGIN TRANSACTION
    EXEC [@NomServeur].Base1.dbo.sp_SetTransactionLogMark @name
    EXEC [@NomServeur].Base2.dbo.sp_SetTransactionLogMark @name
    EXEC [@NomServeur].Base3.dbo.sp_SetTransactionLogMark @name
    COMMIT TRANSACTION
    GO

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Non, ceci ne fonctionnera pas, il faudrait en effet passer par une exécution dynamique.

    Cependant, je ne vois pas l’intérêt de procéder ainsi : par défaut, l’exécution se fait sur le serveur local, il suffit donc supprimer le nom de serveur (la variable dans votre script).

  6. #6
    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 : 42
    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 faudrait :

    • d'abord gérer la transaction
    • Pour que ce que vous souhaitez réaliser fonctionne, utiliser du code SQL dynamique.
    • Ne pas nommer les procédures en commençant par "sp_", parce que cela donne à "penser" au moteur que c'est une procédure stockée système


    Quelques questions se posent tout de même :

    1. La première est posée par aieuuuuuuu;
    2. Est-il vraiment nécessaire d'utiliser une transaction explicite ?
    3. Que fait-on si le serveur ou la base de données cible ne sont pas disponibles ? En l'état actuel, la transaction explicite est annulée ...
    4. Si vous exécutez cette procédure sur plusieurs instances de SQL Server, sont-elles toutes enregistrées en tant que serveur lié sur l'instance à partir de laquelle vous allez exécuter cette procédure ?
    5. Vu le 4, pourquoi ne pas utiliser une fonctionnalité plus adaptée ? Par exemple, SQL Server Integration Services, Central Management Server, Service Broker, ou encore PowerShell ?
    6. Toujours vu le 4, que se passe-t-il si vous devez ajouter une base de données ou un serveur : allez-vous à chaque fois modifier la procédure stockée ? Vous pourriez à la place avoir une table qui en plus vous permette de tracer les changements ...


    Voici un exemple sur la base du code que vous avez donné, mais incomplet au vu des questions ci-dessus :

    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_SetTransactionLogMarkAll
    	@_name nvarchar(128)
    AS
    BEGIN
    	DECLARE @sql_pattern nvarchar(1024) = 'EXEC [SERVER_NAME].[DATABASE_NAME].dbo.sp_SetTransactionLogMark @name'
    		, @sql nvarchar(max);
     
    	BEGIN TRY
    		BEGIN TRANSACTION
    			SELECT	@sql = CASE WHEN @sql IS NULL THEN '' ELSE @sql + CHAR(13) + CHAR(10) END
    					+ REPLACE(REPLACE(@sql_pattern, '[SERVER_NAME]', QUOTENAME(@@SERVERNAME)), '[DATABASE_NAME]', QUOTENAME(database_name))
    			FROM	(
    					VALUES ('Base1'), ('Base2'), ('Base3')
    				) AS DB(database_name);
     
    			EXEC sys.sp_executesql
    				@sql
    				, N'@name nvarchar(128)'
    				, @name = @_name;
    		COMMIT TRANSACTION
    	END TRY
    	BEGIN CATCH
    		DECLARE @err_msg nvarchar(4000) = 'Line ' + CAST(ERROR_LINE() AS varchar(10))
    				+ ' - ' + CAST(ERROR_LINE() AS varchar(10)) + ' - '+ ERROR_MESSAGE()
    			, @err_svt int = ERROR_SEVERITY()
    			, @err_stt int = ERROR_STATE();
     
    		IF XACT_STATE() <> 0
    		BEGIN
    			ROLLBACK TRANSACTION;
    		END
     
    		RAISERROR(@err_msg, @err_svt, @err_stt);
    		RETURN;
    	END CATCH
    END
    @++

Discussions similaires

  1. Variable ou constante dans un script SQL
    Par gold15 dans le forum SQL
    Réponses: 5
    Dernier message: 11/03/2015, 08h46
  2. Prb de syntaxe avec une Variable dans un script SQL 2005
    Par davidso dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 01/03/2007, 18h14
  3. Réponses: 2
    Dernier message: 16/01/2006, 15h07
  4. Gestion de Variables dans un script
    Par John Lee dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 25/03/2005, 14h17
  5. Nom de champ variable dans une requête SQL
    Par stip dans le forum ASP
    Réponses: 2
    Dernier message: 30/09/2004, 18h02

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