Frage

Hier ist meine Konfiguration:

  • Ich habe einen erneuten runnable Batch-Skript, das ich verwende, um meine Datenbank zu aktualisieren.
  • Innerhalb dieses Batch-Skript, habe ich Code, der folgendes sagt:
    • Wenn Table 'A' nicht existiert, dann Tabelle 'A' erstellen und einfügen Reihen hinein.
  • auf Später im Batch-Skript, erstelle ich eine schemabound indizierte Sicht auf die Tabelle.
  • Manchmal , wenn ich das Skript erneut ausführen, das heißt, nachdem die Tabelle erstellt wurde, SQL Server Management Studio wertet den „Einfügungen“ Code, der durch geschützt ist die ' wenn diese Tabelle ‚Code nicht vorhanden ist, und ergibt die folgende Fehlermeldung:

    Msg 1934, Stufe 16, Status 1, Zeile 15 INSERT fehlgeschlagen, da die folgenden SET-Optionen falsche Einstellungen aufweisen: 'CONCAT_NULL_YIELDS_NULL, ANSI_WARNINGS, ANSI_PADDING, ARITHABORT'. Stellen Sie sicher, dass die SET-Optionen für die Verwendung korrekt sind mit indizierten Sichten und / oder Indizes für berechnete Spalten und / oder gefilterten Indizes und / oder Abfrage-Benachrichtigungen und / oder XML-Datentyp Methoden und / oder räumlichen Index-Operationen.

  • Bitte beachten Sie: Wenn jemand diese INSERT-Anweisung in einem Vakuum, um zu versuchen, würde ich voll erwartet SSMS diese Fehler zu erzeugen.
    • Aber nicht , wenn es durch einen bedingten Block geschützt ist.

Meine Frage:

  

Hat die SSMS Compiler auswerten alle Ausdrücke, unabhängig davon, ob sie tatsächlich ausgeführt werden?

War es hilfreich?

Lösung

Ja, es alle von ihnen auswertet, werfen Sie einen Blick auf diese

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, Level 15, Status 1, Zeile 12 Der Variablenname ‚@ i2‘ wurde bereits deklariert. Variablennamen müssen innerhalb einer Abfrage-Batch oder einer gespeicherten Prozedur eindeutig sein.

Ein weiteres Beispiel mit temporären Tabellen ist hier: Was Namensauflösung aufgeschoben wird und warum brauchen Sie kümmern?

Ihr einziger Ausweg wäre es in dynamischen einzuwickeln SQL

Andere Tipps

Beachten Sie, dass die meisten der Einstellungen, die Sie erwähnen, sind auf Verbindungsebene, das heißt für den Fall, Sie setzen / ändern sie sie wirksam bleiben, wenn Sie die Verbindung zu schließen oder explizit ihren Wert ändern.

auf Ihre Frage zurückkehrend. Der Fehler erwähnen Sie sieht aus wie Laufzeitfehler, das heißt die INSERT tatsächlich ausgeführt wird. Es wäre besser, wenn Sie Ihren Skript (Weglassen Details, aber halte Chargen) zeigen können.

Edit: es ist nicht SSMS Compiler, dass auswertet SQL Sie auszuführen versuchen - es ist SQL Server. Was bedeutet Ihnen von ‚auswerten‘? Ist es ‚Ausführen‘? Wenn Sie einen Stapel laufen (was tatsächlich von einem Server ausgeführt wird), SQL Server tut ersten syntaktische Analyse und wirft Fehler, falls es irgendeine findet syntaktische Fehler, nichts wird an diesem Zeitpunkt ausgeführt. Im Falle Syntax ok ist, können Sie Batch-Start des Servers ausgeführt wird.

Auch hier ist der Fehler, den Sie zeigen, scheint zu sein Laufzeit - so dass ich denke, man sorgfältig die Bedingungen beobachten würde und verfolgen, was passiert (oder teilen Sie uns mehr Details über 'manchmal').

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top