SET NOCOUNT Fehler bei der Verarbeitung des SQL-Aufrufs nach dem Upgrade

13

Wir aktualisieren unsere Testumgebung mit einem neuen Server und einer aktualisierten Version von Microsoft SQL Server und sind auf ein Problem gestoßen.

Auf dem neuen Server wird unser alter Code "Vorgang ist nicht zulässig, wenn das Objekt geschlossen wird", wenn einige gespeicherte Prozeduren ausgeführt werden. Diese Nachricht wurde nie auf dem alten Server angezeigt. Wenn wir es gefunden haben, kann das Problem durch Hinzufügen SET NOCOUNT ON;zur gespeicherten Prozedur behoben werden.

Ich habe mir die Standardeinstellungen in der Datenbank angesehen und festgestellt, dass keine anderen Einstellungen (SQL Server 2008 im Vergleich zu SQL Server 2014) in Bezug auf die Standardeinstellungen vorgenommen wurden.

Auf welche Einstellung sollte ich SET NOCOUNT ONachten , um dies global zu lösen, ohne tausend gespeicherte Procs hinzufügen zu müssen?

UnhandledExcepSean
quelle
2
Alle gespeicherten Prozeduren sollten das Verhalten angeben, auf das Sie sich verlassen. Dies ist viel sicherer als die Verwendung von Benutzeroptionen. Ich würde sogar möglicherweise argumentieren, dass jede gespeicherte Prozedur immer mit immer beginnen sollte SET NOCOUNT ON;.
Aaron Bertrand
@ AaronBertrand Ich stimme zu; Das letzte Projekt, an dem ich beteiligt war, hatte eine Vorlage, für die keine Anzahl festgelegt wurde, aber dies ist derzeit in diesem Projekt keine Option
UnhandledExcepSean
Beachten Sie, dass Sie ein Skript schreiben können, um alle gespeicherten Prozeduren zu ändern und SET NOCOUNT ON;am Anfang der gespeicherten Prozedur (nach BEGIN) anzuhängen . Die Anzahl der gespeicherten Prozeduren sollte eigentlich kein Problem sein.
Erik A
1
@ Erik-A - Sie können nicht sicher sein, ob eine gespeicherte Prozedur mit beginnt BEGIN- es ist nett, aber nicht erforderlich.
Max Vernon

Antworten:

16

Die SQL Server-Konfiguration verfügt über eine entsprechend aufgerufene Option user options, die mithilfe der sp_configuregespeicherten Systemprozedur festgelegt werden kann. Ich habe einen Blogbeitrag über SQL Server Science geschrieben, in dem gezeigt wird, wie die Benutzeroptionen überprüft und festgelegt werden.

Kurz gesagt, Sie können den "Konfigurationswert" wie folgt vom alten Server abrufen:

EXEC sys.sp_configure 'user options';

Stellen Sie dann den neuen Server so ein, dass er die gleichen Optionen verwendet:

EXEC sys.sp_configure 'user options', <config value>;
RECONFIGURE

(Ersetzen Sie den <config value> durch den Wert vom alten Server).

Max Vernon
quelle
Das ist mit ziemlicher Sicherheit die Ursache (wartet auf Bestätigung). Der alte Server hatte einen Wert von 512, was laut MS NOCOUNT ist ( docs.microsoft.com/en-us/sql/database-engine/configure-windows/… ). Ich habe das vorher nicht gesehen, da ich nur @@ OPTIONS
UnhandledExcepSean
Das ist definitiv richtig. Wenn SET NOCOUNT ONdas Problem behoben ist, können Sie es durch Festlegen der Benutzeroptionen auf 512 beheben.
Max Vernon