Question

Voici ma configuration:

  • J'ai un script batch re-runnable que j'utilise pour mettre à jour ma base de données.
  • À l'intérieur de ce script batch, j'ai le code qui dit ce qui suit:
    • Si le tableau « A » n'existe pas, créez le tableau « A » et insérer des lignes dans ce.
  • Plus tard dans ce script batch, je crée une schemabound vue indexé sur cette table.
  • Parfois , quand je re-exécuter le script, qui est après la table a été créée, SQL Server Management Studio évalue le code "insérer des lignes", qui est protégé par le ' Si ce tableau n'existe pas » code, et donne l'erreur suivante:

    Msg 1934, Niveau 16, État 1, ligne 15 INSERT a échoué parce que les options SET suivantes ont des paramètres incorrects: 'CONCAT_NULL_YIELDS_NULL, ANSI_WARNINGS, ANSI_PADDING, ARITHABORT. Vérifiez que les options SET sont correctes pour une utilisation avec des vues indexées et / ou des index sur des colonnes calculées et / ou des index filtrés et / ou les notifications de requête et / ou des méthodes de type de données XML et / ou des opérations d'index spatial.

  • S'il vous plaît noter: Si quelqu'un d'essayer cette instruction INSERT dans le vide, je complètement attends SSMS pour générer cette erreur.
    • Mais pas quand il est protégé par un bloc conditionnel.

Ma question:

  

Est-ce que les SSMS compilateur évaluent tous expressions, indépendamment du fait qu'ils seront effectivement exécutés?

Était-ce utile?

La solution

Oui, il évalue tous, jetez un oeil à ce

declare @i int
select @i =1

if @i = 1
begin
    declare @i2 int
    set @i2 = 5
end
else 
begin
    declare @i2 int
    set @i2 = 5
end

Msg 134, niveau 15, état 1, ligne 12 Le nom de la variable « @ i2 » a déjà été déclarée. Les noms de variables doivent être uniques dans un lot de requête ou procédure stockée.

Un autre exemple avec des tables temporaires est ici: Ce qui est reporté la résolution de nom et pourquoi besoin de soins vous?

votre uniquement de façon serait de l'envelopper dans SQL dynamique

Autres conseils

Notez que la plupart des paramètres que vous mentionnez sont la connexion au niveau, à savoir dans le cas où vous définissez / les changer, ils restent en vigueur à moins que vous fermez la connexion ou modifier explicitement leur valeur.

Pour revenir à votre question. L'erreur que vous mentionner ressemble erreur d'exécution, à savoir l'INSERT est effectivement exécutée. Il serait mieux si vous pouvez montrer votre script (en omettant les détails, mais en gardant des lots).

Edit: il n'est pas SSMS compilateur qui vous évalue SQL essayez d'exécuter - il est SQL Server. Qu'est-ce que vous vouliez dire par « évaluer »? Est-ce exécuter? Lorsque vous exécutez un lot (qui est ce qui est réellement en cours d'exécution par un serveur), SQL Server effectue une première analyse syntaxique et jette une erreur dans le cas où il en trouve syntaxique erreur, rien est en cours d'exécution à ce moment. Dans la syntaxe de cas est ok, le serveur démarre vous exécutaient batch.

Encore une fois, l'erreur que vous montrez semble être runtime - donc je suppose que vous observer attentivement les conditions et de suivre ce qui se passe (ou de nous fournir plus de détails sur 'parfois').

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