2010-04-06 7 views
4

Je suis en train d'écrire un script DML qui met à jour une colonne, mais je voulais vous assurer que la colonne existait d'abord si je l'ai enveloppé dans un if exists blocinstruction UPDATE enveloppé dans un IF EXISTS bloc

IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='Client' AND COLUMN_NAME='IsClarityEnabled') 
BEGIN 
    UPDATE Client SET IsClarityEnabled = 1 WHERE ClientID = 21 
END 

Donc l'étrangeté est qu'il essaye d'exécuter la mise à jour même si elle échoue la condition. Donc la colonne n'existe pas et l'instruction UPDATE s'exécute et j'obtiens une erreur. Pourquoi?

Encore plus étrange est que cela fonctionne:

IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='Client' AND COLUMN_NAME='IsClarityEnabled') 
BEGIN 
    EXEC('UPDATE Client SET IsClarityEnabled = 1 WHERE ClientID = 21') 
END 

Y at-il quelque chose de spécial au sujet d'une commande UPDATE qui provoque de se comporter de cette façon?

+0

Cette question signifie-t-elle que vous utilisez Clarity? Si oui, je ressens votre douleur. – HLGEM

+0

Oui, la clarté est utilisée ici. En soi, ce n'est pas si mal. – ant

Répondre

6

Le problème est que le script sera compilé/analysé, et si la colonne n'existe pas, vous aurez une erreur de compilation/analyse.

Nom de colonne non valide 'IsClarityEnabled'.

+0

+1, vous devriez noter qu'il ne compile pas la chaîne dans l'EXEC() avant l'exécution, donc il n'essaie pas de valider la colonne qui n'existe pas encore. –

+0

C'est exact, c'est le ** Dynamic Sql ** vous pourriez trouver la référence à –

1

il tente d'exécuter la mise à jour même si elle échoue la condition

Etes-vous sûr? Je soupçonne que ce qui se passe réellement est que SQL Server tente d'analyser le UPDATE, quelle que soit la valeur de la condition. Comme l'analyse se produit avant l'exécution, SQL Server ne peut pas savoir au moment de l'analyse que vous avez protégé ce UPDATE par une vérification - l'analyseur sait seulement qu'il n'y a pas de colonne IsClarityEnabled sur Client, et donc il se plaint.

La raison pour laquelle le EXEC fonctionne comme vous le souhaitez est précisément parce que le littéral de chaîne n'est pas traité par l'analyseur. C'est la manière standard d'avoir des scripts qui doivent s'exécuter sur un schéma qui n'est pas connu avant l'exécution.

+0

J'avais supposé que c'était dû à l'échec d'exécution mais c'était l'échec de l'analyseur. – ant