Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[MSSQL] Select in een trigger met variabele *

Pagina: 1
Acties:

  • SysRq
  • Registratie: December 2001
  • Laatst online: 15:18
Ik heb hier een stukje code waarmee ik binnen een trigger door de columns heenloop en de waarde in een andere tabel probeer te plaatsen (ivm auditting)

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
--- Door de columns heenlopen
    while @intColumn <= @intCountColumn 
    begin
      if Columns_Updated() & @intColumn = @intColumn
      begin
        --- en toevoegen in detail
        set @varColumnname = Col_Name(Object_ID('CRED'), @intColumn);
        select @query_value = @varColumnname from inserted
        INSERT INTO LOG_DETAIL (MASTERID,VELDNAAM,NIEUW) 
        SELECT @MASTERID,@varColumnname,@query_value FROM INSERTED
      end
    
    set @intColumn = @intColumn + 1 
    end


Het probleem is nu dat de code "select @query_value = @varColumnname from inserted" niet de juiste waarde in @query_value zet. Er staat namelijk niet de waarde van het toegevoegde record in, maar de veldnaam!

Ik heb al heel wat forums af lopen zoeken, en de msdn doorzocht, maar tot nu toe geen oplossing kunnen vinden. Iemand enig idee? :)

-


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:10
Dit heeft niets met SEA te maken; eerder gewoon programming

-> PRG

Dat je de columnnaam terugkrijgt, is niet verwonderlijk.
Wat jij probeert te doen, is equivalent met dit:
code:
1
select @query_value = 'melp' from inserted

Je @varColumnname wordt dus gewoon als een constante beschouwd, en je query zal niet geparset worden zodat die varColumnName als column-name wordt beschouwd.
Wat je zou kunnen doen, is je query dynamisch opbouwen als string, en dan met exec of sp_executesql werken.
code:
1
2
set @queryString = 'SELECT ' + @varColumnName + ' from inserted'
sp_executesql @queryString


Iets anders : ik denk ook wel dat het niet echt aan te raden is voor performantie-doeleinden om op deze manier (met een while, etc...) binnen een trigger te gaan werken.

/woei, m'n eerste post in 2008

https://fgheysels.github.io/


  • SysRq
  • Registratie: December 2001
  • Laatst online: 15:18
Ok, duidelijk. Het probleem is dat je via sp_executesql niet meer de beschikking hebt over 'from inserted'. Je kunt voor zover ik kan zien ook geen parameters gebruiken?

Heb je misschien een suggestie om van die while af te komen?

-


  • SysRq
  • Registratie: December 2001
  • Laatst online: 15:18
Schop! :)

-


  • SysRq
  • Registratie: December 2001
  • Laatst online: 15:18
Ok, ik heb inmiddels de trigger aangepast. Op de manier zoals ik het wil gaat blijkbaar niet.

Wat ik nu gedaan heb is voor iedere column in de tabel een if statement toegevoegd:

SQL:
1
2
3
4
5
if ((SELECT veld from inserted) <> (SELECT veld from deleted))
begin
  INSERT INTO LOG_DETAIL (MASTERID,VELDNAAM,NIEUW) 
        SELECT @MASTERID,@varColumnname,veld FROM INSERTED 
end

Dit werkt in zoverre goed dat de juiste waarde nu opgeslagen worden. De IF lijkt echter nog niet te werken: de insert wordt ook bij niet gewijzigde records uitgevoerd...

-