Ich habe ein SQL-Skript, das jedes Mal ausgeführt werden muss, wenn ein Client die Funktionalität "Datenbankverwaltung" ausführt. Das Skript umfasst das Erstellen gespeicherter Prozeduren in der Client-Datenbank. Einige dieser Clients verfügen möglicherweise bereits beim Ausführen des Skripts über die gespeicherte Prozedur, andere möglicherweise nicht. Ich muss die fehlenden gespeicherten Prozeduren zur Client-Datenbank hinzufügen, aber es spielt keine Rolle, wie sehr ich versuche, die T-SQL-Syntax zu biegen
CREATE / ALTER PROCEDURE 'muss die erste Anweisung in einem Abfragebatch sein
Ich habe das Löschen vor dem Erstellen von Werken gelesen, aber ich mag es nicht so.
IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'MyProc')
DROP PROCEDURE MyProc
GO
CREATE PROCEDURE MyProc
...
Wie kann ich die Existenz einer gespeicherten Prozedur überprüfen und erstellen, wenn sie nicht vorhanden ist, aber ändern, wenn sie vorhanden ist?
quelle
Antworten:
Sie können Prozedurcode überall dort ausführen, wo Sie eine Abfrage ausführen können.
Kopieren Sie einfach alles nach
AS
:Dieser Code macht genau die gleichen Dinge, die ein gespeicherter Prozess tun würde, wird jedoch nicht auf der Datenbankseite gespeichert.
Das ist ähnlich wie bei der anonymen Prozedur
PL/SQL
.Aktualisieren:
Ihr Fragentitel ist etwas verwirrend.
Wenn Sie eine Prozedur nur erstellen müssen, wenn sie nicht vorhanden ist, ist Ihr Code in Ordnung.
Hier ist , was
SSMS
im Skript erstellen ausgibt:Aktualisieren:
Beispiel für die Vorgehensweise beim Einfügen des Schemas:
Im obigen Beispiel ist dbo das Schema.
Aktualisieren:
In SQL Server 2016+ können Sie dies einfach tun
CREATE OR ALTER PROCEDURE dbo.MyProc
quelle
@astander
: Sie können auch anonymen Code aus den gespeicherten Prozeduren aufrufen. Um ihre Ausgabe in einem zu verwendenINSERT
, müssen SieOPENROWSET
oder verwendenOPENQUERY
was auch mit dem anonymen Code funktioniert. Natürlich hat der anonyme Code Nachteile: Er wird beispielsweise nur unter den Berechtigungen des Anrufers ausgeführt. Mein Punkt ist, dass es möglich ist, nicht bevorzugte Art, Dinge zu tun :)Mir ist klar, dass dies bereits als beantwortet markiert wurde, aber wir haben es früher so gemacht:
Nur um zu vermeiden, dass der Vorgang abgebrochen wird.
quelle
GRANT
Aussagen explizit im Skript haben möchten, falls sie sich ändern . es gibt also immer noch eine Rechtfertigung,DROP
anstatt zu verwendenALTER
.Wenn Sie nach der einfachsten Möglichkeit suchen, die Existenz eines Datenbankobjekts vor dem Entfernen zu überprüfen, haben Sie folgende Möglichkeit (Beispiel verwendet ein SPROC, genau wie das obige Beispiel, kann jedoch für Tabellen, Indizes usw. geändert werden):
Dies ist schnell und elegant, aber Sie müssen sicherstellen, dass Sie über alle Objekttypen hinweg eindeutige Objektnamen haben, da dies nicht berücksichtigt wird.
Ich hoffe das hilft!
quelle
Ich weiß, dass Sie "eine Prozedur ändern möchten, wenn sie existiert, und sie nur löschen möchten, wenn sie nicht existiert", aber ich glaube, es ist einfacher, die Prozedur einfach immer zu löschen und sie dann neu zu erstellen. So löschen Sie die Prozedur nur, wenn sie bereits vorhanden ist:
Der zweite Parameter weist
OBJECT_ID
an, nur nach Objekten zu suchenobject_type = 'P'
, bei denen es sich um gespeicherte Prozeduren handelt:Die vollständige Liste der Optionen erhalten Sie über:
quelle
Ab SQL SERVER 2016 können Sie das neue verwenden
DROP PROCEDURE IF EXISTS
.DROP { PROC | PROCEDURE } [ IF EXISTS ] { [ schema_name. ] procedure } [ ,...n ]
Referenz: https://msdn.microsoft.com/en-us/library/ms174969.aspx
quelle
Ich weiß , es ist eine sehr alte Post, aber da dies scheint in den Top - Suchergebnissen somit das neueste Update für die Zugabe mit SQL Server 2016 SP1 -
Dadurch wird eine gespeicherte Prozedur erstellt, falls diese noch nicht vorhanden ist, sie wird jedoch geändert, wenn sie vorhanden ist.
Referenz
quelle
DROP IF EXISTS ist eine neue Funktion von SQL Server 2016
https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/
quelle
Ich hatte den gleichen Fehler. Ich weiß, dass dieser Thread bereits ziemlich tot ist, aber ich möchte neben "anonymes Verfahren" eine weitere Option festlegen.
Ich habe es so gelöst:
Überprüfen Sie, ob die gespeicherte Prozedur vorhanden ist:
Das
"CREATE/ALTER PROCEDURE' must be the first statement in a query batch"
ist aber noch da. Ich habe es so gelöst:Am Ende habe ich diesen Code:
quelle
Hier ist eine Methode und einige Gründe dafür. Es ist nicht so schön, den gespeicherten Prozess zu bearbeiten, aber es gibt Vor- und Nachteile ...
UPDATE: Sie können diesen gesamten Anruf auch in eine TRANSAKTION einschließen. Einschließen vieler gespeicherter Prozeduren in eine einzelne Transaktion, die alle festschreiben oder alle zurücksetzen können. Ein weiterer Vorteil des Einschlusses in eine Transaktion besteht darin, dass die gespeicherte Prozedur für andere SQL-Verbindungen immer vorhanden ist, solange sie nicht die Transaktionsisolationsstufe READ UNCOMMITTED verwenden!
1) Um Änderungen nur als Prozessentscheidung zu vermeiden. Unsere Prozesse sind immer, wenn Existenzen fallen, dann schaffen. Wenn Sie das gleiche Muster anwenden und davon ausgehen, dass der neue PROC der gewünschte Prozess ist, ist das Catering für Änderungen etwas schwieriger, da Sie eine IF EXISTS ALTER ELSE CREATE haben würden.
2) Sie müssen CREATE / ALTER als ersten Aufruf in einen Stapel setzen, damit Sie eine Folge von Prozeduraktualisierungen nicht in eine Transaktion außerhalb von Dynamic SQL einschließen können. Wenn Sie einen ganzen Stapel von Prozeduraktualisierungen ausführen oder alle zurücksetzen möchten, ohne eine DB-Sicherung wiederherzustellen, ist dies im Grunde eine Möglichkeit, alles in einem einzigen Stapel zu erledigen.
quelle
Ab SQL Server 2008 können Sie "
INFORMATION_SCHEMA.ROUTINES
"quelle
Ich habe anscheinend nicht den Ruf, um abzustimmen oder zu kommentieren, aber ich wollte nur sagen, dass Geoffs Antwort mit EXEC (sp_executesql könnte besser sein) definitiv der richtige Weg ist. Durch das Löschen und erneute Erstellen der gespeicherten Prozedur wird die Aufgabe am Ende erledigt, aber es gibt einen Moment, in dem die gespeicherte Prozedur überhaupt nicht vorhanden ist, und das kann sehr schlecht sein, insbesondere wenn dies der Fall ist wiederholt ausführen. Ich hatte alle möglichen Probleme mit meiner Anwendung, weil ein Hintergrund-Thread einen IF EXISTS DROP ... CREATE ausführte, während ein anderer Thread versuchte, die gespeicherte Prozedur zu verwenden.
quelle
** Der einfachste Weg, einen in T-Sql gespeicherten Prozess zu löschen und neu zu erstellen, ist **
quelle
Hier ist das Skript, das ich benutze. Damit vermeide ich, die gespeicherten Prozesse unnötig zu löschen und neu zu erstellen.
quelle
Überprüfen Sie, ob eine gespeicherte Prozedur vorhanden ist
Überprüfen Sie IF Exist auf Trigger, Function, indem Sie auch auf den folgenden Link klicken: http://www.gurujipoint.com/2017/05/check-if-exist-for-trigger-function-and.html
quelle
Warum gehst du nicht so einfach?
..........
quelle
%
, so dass sich dieLIKE
als=
Neben der Antwort von @Geoff habe ich ein einfaches Tool erstellt, das eine SQL-Datei generiert, die Anweisungen für gespeicherte Prozeduren, Ansichten, Funktionen und Trigger enthält.
Siehe MyDbUtils @ CodePlex .
quelle
Ich wundere mich! Warum schreibe ich nicht die ganze Abfrage wie
Ich weiß bereits, dass die ersten beiden Prozeduren bereits vorhanden sind. SQL wird ausgeführt. Die Abfrage gibt den Fehler der ersten beiden Prozeduren aus, aber es wird immer noch die letzte Prozedur erstellt. SQl kümmert sich selbst um das, was bereits vorhanden ist. Dies ist, was ich immer mit all meinen mache Kunden!
quelle
CREATE-Prozedur, WENN NICHT 'Ihr Prozessname' existiert () BEGIN ... END
quelle