Suppression du slider t-sql

J'ai un triggersur dans mssql dans lequel je veux comparer chaque colonne de la table insérée avec la table supprimée pour vérifier si la valeur a changé … Si la valeur a changé je veux insert le nom de colonne dans une table de temp.

Mon code jusqu'à maintenant:

declare columnCursor CURSOR FOR SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'MyTable' AND TABLE_SCHEMA='dbo' --save inserted and deleted into temp tables select * into #row1 from Inserted select * into #row2 from Deleted declare @tmp table(column_name nvarchar(max)) declare @column nvarchar(50) OPEN COlumnCUrsor FETCH NEXT FROM ColumnCursor INTO @column while @@FETCH_STATUS=0 begin declare @out bit declare @sql nvarchar(max) = N' select @out = case when r1.'+@column+'r2.'+@column+' then 1 else 0 end from #row1 r1 left join #row2 r2 on r1.sys_volgnr=r2.sys_volgnr' exec sp_executesql @sql,N'@out bit OUTPUT', @out=@out OUTPUT if( @out = 1 ) begin insert into @tmp VALUES(@column) end FETCH NEXT FROM ColumnCursor INTO @column end CLOSE ColumnCursor; DEALLOCATE ColumnCursor; 

Y a-t-il un moyen plus facile d'accomplir cela?

    Oui il y a.
    Vous pouvez utiliser la fonction COLUMNS_UPDATED pour déterminer les colonnes qui ont réellement changé les valeurs, bien que ce ne soit pas une fonction très conviviale en termes de lisibilité du code.
    Lisez cet article du support de Microsoft appelé Utilisation correcte de la fonction COLUMNS_UPDATED () pour voir ce que je veux dire.

    Je suis tombé sur un article intitulé Une alternative plus performante à COLUMNS_UPDATED () , peut-être qu'il peut vous aider ou au less vous inspirer.

    Je noterai que vous devriez résister à la tentation d'utiliser la fonction UPDATE() , car elle peut returnner vrai même si aucune donnée n'a été modifiée.
    voici la partie pertinente de sa page MSDN:

    UPDATE () renvoie la valeur TRUE indépendamment de la réussite d'une tentative INSERT ou UPDATE.

    On dirait que vous essayez de build une solution dynamic, ce qui pourrait être utile si vous vous attendez à changer souvent (= nouvelles colonnes à append, etc.). Vous pourriez faire quelque chose comme ça (en pseudo-code)

    Construire un SQL dynamic basé sur DMV (INFORMATION_SCHEMA.COLUMNS) pour les noms de colonnes:

     insert into table ... select function_to_split_by_comma ( case when I.col1 = U.col1 then 'col1,' else '' end + case when I.col2 = U.col2 then 'col2,' else '' end + ... ) where I.key_column1 = U.key_column1 ... 

    Ces noms (col1, col2) doivent être les colonnes de la requête DMV, + la casse pour chaque ligne, puis la partie SQL fixe pour le début + vous devez déterminer comment joindre inséré et supprimé, ce qui nécessite la key primaire.

    Pour split datatables en lignes, vous pouvez utiliser par exemple le delimited_split_8k de Jeff Moden ( http://www.sqlservercentral.com/articles/Tally+Table/72993/ ).

    Aussi, comme l'a souligné Damien, il peut y avoir plus d'une rangée dans les tables insérées / supprimées.