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 :

TSQL Trigger update


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    TSQL Trigger update
    Bonjour,

    je suis assez newbie sur le t-sql et les triggers et j'aurais besoin d'un coup de pouce.
    voilà mon besoin :
    est enregistré dans une table, deux valeurs (Arret - Direction)
    je souhaite dès qu'un enregistrement est ajouté mettre à jour un 3ème champ (code) à partir d'une comparaison dans une autre table.

    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
    declare
    	@in_DirSaisie nvarchar(400)
    	
    
    BEGIN
    	-- Declare the return variable here <@ResultVar, sysname, @Result> <Function_Data_Type, ,int>
    	DECLARE @ResultVar nvarchar(50)
    	Declare @v_SensA nvarchar(225)
    	Declare @v_SensB nvarchar(225)
    	
    	
    	
    	-- Add the T-SQL statements to compute the return value here SELECT <@ResultVar, sysname, @Result> = <@Param1, sysname, @p1>
    Essai1	
    	set @ResultVar = ( select distinct CodeMRN from Topo t where @in_DirSaisie in (SELECT distinct rtrim(ltrim(t.lg_Arr))+rtrim(ltrim(t.SensB)) FROM Topo t))
    	
    	--select distinct CodeMRN from Topo t where '90-14-JuilletGeorges Braque / Technopôle' in (SELECT distinct rtrim(ltrim(t.lg_Arr))+rtrim(ltrim(t.SensB)) FROM Topo t)
    Essai2		
    		IF @in_DirSaisie = @v_SensA set @ResultVar = (select codeMRN from Topo where @v_SensA = @in_DirSaisie)
    		ELSE   
    		   BEGIN  
    			 IF @in_DirSaisie = @v_SensB set @ResultVar = (select codeMRN from Topo where @v_SensB = @in_DirSaisie);  
    		   ELSE  
    			  SET @in_DirSaisie = null;  
    		   END ;	
    	
    	
    	-- Return the result of the function <@ResultVar, sysname, @Result>
    	RETURN @ResultVar
    
    END


    le message de retour du débogueur est le suivant :

    Msg*512, Niveau*16, État*1, Ligne*22
    Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
    Merci votre aide

  2. #2
    Rédacteur

    Dans SQL Server les déclencheurs sont ensemblistes. Cela signifie qu'ils ne sont activer qu'une seule fois, même s'il y a 2545325456 lignes impactées par la commande ....
    Donc, la présence de variables est la suspicion d'un code inadapté...

    Commencez par nous donner TOUT le code de votre trigger et non pas un petit bout à la con qui ne sert a rien ! On ne sait même pas si c'est un déclencheur AFTER ou INSTAED, si c'est sur une vue ou une table et si c'est sur INSERT, UPDATE ou DELETE !

    L’informatique c'est tout le contraire d'une boule de cristal

    A +
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  3. #3
    Nouveau membre du Club
    Bonjour @SQLPRO

    En fait je n'ai pas encore le code du trigger, il est en vrac.
    je décomposais mon code pour déjà avoir la valeur que je souhaitais avant l'update.

    mais pour essayer de répondre à ta question (si tu permets que je te tutoie ce serait un after insert update.

    j'espère que ce sera suffisamment clair

  4. #4
    Nouveau membre du Club
    je vais reposer ma question, il faut effectivement que je mette mes idées à plat.
    c'est pas clair mon truc

  5. #5
    Nouveau membre du Club
    Bon,

    j'ai finalement réussi à réaliser mon trigger :

    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
    56
    57
    58
    59
    60
    61
    USE [QSE]
    GO
    /****** Object:  Trigger [dbo].[QSE_CodeMRN]    Script Date: 11/04/2020 13:29:50 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- Batch submitted through debugger: Test Trigger QSE.sql|0|0|F:\Scripts\QSE Debug SQL\Test Trigger QSE.sql
    Create TRIGGER QSE_CodeMRN
    ON [dbo].[Constat]
    After insert
     
    AS
    begin
    --------------------------------------
    --definitions variables
    set nocount on;
    Declare
    @id_C int
    ,@cDirection nvarchar(150)
    ,@sensA nvarchar(150)
    ,@sensB  nvarchar(150)
    Declare MajCodeMRN cursor for select id_constat,rtrim(ltrim(LgArr))+rtrim(ltrim(Direction))as Dir from inserted;
    Open MajCodeMRN
    fetch MajCodeMRN into @id_C, @cDirection;
     
    while (@@FETCH_STATUS=0)
    Begin
    	--Rechercher les sens
    		set @sensA = (select distinct 
    		t.codeMRN
    		from inserted c left join QSE.dbo.Topo t on rtrim(ltrim(c.lgArr))+rtrim(ltrim(c.Direction)) = rtrim(ltrim(t.lg_Arr))+rtrim(ltrim(t.SensA))
    		where  c.direction is not null and t.Sens =1 and Id_Constat = @id_C)
     
    		set @sensB = (select distinct 
    		t.codeMRN
    		from inserted c left join QSE.dbo.Topo t on rtrim(ltrim(c.lgArr))+rtrim(ltrim(c.Direction)) = rtrim(ltrim(t.lg_Arr))+rtrim(ltrim(t.SensB))
    		where  c.direction is not null and t.Sens =2 and Id_Constat = @id_C)
     
    	--Tester et mettre à jour 	
     
    			if @sensA is not null
    			update Constat
    			set codeMRN = @sensA
    			where Id_Constat =@id_C
     
    			else if @sensB is not null
    			update Constat
    			set codeMRN = @sensB
    			where Id_Constat =@id_C
     
    			Else 
    			update Constat
    			set codeMRN = 'inconnu'
    			where Id_Constat =@id_C
     
    fetch MajCodeMRN into @id_C, @cDirection;
    End;
    close MajCodeMRN;
    deallocate MajCodeMRN;
    End


    ça passe bien quand je fais un test via une requête insert à partir du serveur SQL.
    en revanche quand à partir du client PowerApps, je tente une écriture dans la base, je me fais bouler :



    si quelqu'un a une idée

    merci

  6. #6
    Nouveau membre du Club
    J'ai bien trouvé ça,

    http://www.sql-server-helper.com/error-messages/msg-334.aspx

    mais je comme je n'ai pas d'output dans mon trigger, je ne comprends pas trop
    Ou c'est qu'il est implicite.

  7. #7
    Nouveau membre du Club
    En fait c'est une limite PowerApps,
    Voir ici
    rien à voir avec SQL Server.

  8. #8
    Expert éminent
    Virer ce curseur inutile qui pénalise les performances et faites du SQL assembliste !
    les règles du forum - mode d'emploi du forum
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    JE NE RÉPONDS PAS aux questions techniques par message privé.

###raw>template_hook.ano_emploi###