Question

Je dois parcourir les champs d'une table et faire quelque chose si sa valeur ne correspond pas à sa valeur par défaut.

Je suis en situation de déclenchement et je connais donc le nom de la table. Je passe ensuite en boucle dans chacun des les champs utilisant cette boucle:

select @field = 0, @maxfield = max(ORDINAL_POSITION) from
INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = @TableName

while @field < @maxfield
begin
...

Je peux alors obtenir le nom du champ à chaque itération via la boucle:

select @fieldname = COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = @TableName
and ORDINAL_POSITION = @field

Et je peux obtenir la valeur par défaut pour cette colonne:

select @ColDefault = SUBSTRING(Column_Default,2,LEN(Column_Default)-2)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE Table_Name = @TableName
AND Column_name = @fieldname

J'ai tout ce dont j'ai besoin mais je ne vois pas comment comparer ensuite le 2. Parce que Je n'ai pas le nom du champ comme constante, seulement dans une variable, je ne peux pas voir comment obtenir la valeur du tableau 'inséré' (rappelez-vous que je suis dans un déclencheur) afin de voir si elle est identique à la valeur par défaut (tenue maintenant dans @ColDefault en tant que varchar).

Était-ce utile?

La solution

Tout d'abord, rappelez-vous qu'un déclencheur peut être déclenché avec plusieurs enregistrements entrant simultanément. Si je fais cela:

INSERT INTO dbo.MyTableWithTrigger
  SELECT * FROM dbo.MyOtherTable

alors mon déclencheur sur le MyTableWithTrigger devra gérer plus d’un enregistrement. Le " inséré " pseudotable aura plus qu’un seul enregistrement.

Ceci dit, pour comparer les données, vous pouvez exécuter une instruction select comme ceci:

DECLARE @sqlToExec VARCHAR(8000)
SET @sqlToExec = 'SELECT * FROM INSERTED WHERE [' + @fieldname + '] <> ' + @ColDefault
EXEC(sqlToExec)

Cela retournera toutes les lignes de la pseudotable insérée qui ne correspondent pas aux valeurs par défaut. On dirait que vous voulez faire quelque chose avec ces lignes, vous devez donc créer une table temporaire avant d'appeler cette chaîne @sqlToExec. Au lieu de simplement sélectionner les données, insérez-la dans la table temporaire. Vous pouvez ensuite utiliser ces lignes pour gérer les exceptions dont vous avez besoin.

One catch - ce T-SQL ne fonctionne que pour les champs numériques. Vous voudrez probablement créer une gestion séparée pour différents types de champs. Vous pouvez avoir des caractères varchars, numériques, des blobs, etc., et vous aurez besoin de différentes manières de les comparer.

Autres conseils

Je pense que vous pouvez le faire avec et exec.

Mais pourquoi ne pas simplement générer du code une fois. Ce sera plus performant

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top