Mam skrypt SQL, który musi być uruchamiany za każdym razem, gdy klient wykonuje funkcję „zarządzania bazą danych”. Skrypt obejmuje tworzenie procedur przechowywanych w bazie danych klienta. Niektóre z tych klientów mogą już mieć procedurę przechowywaną po uruchomieniu skryptu, a niektóre nie. Potrzebuję dodać brakujące procedury przechowywane do bazy danych klienta, ale nie ma znaczenia, ile próbuję zgiąć składnię T-SQL, otrzymuję
CREATE / ALTER PROCEDURE ”musi być pierwszą instrukcją w partii zapytania
Przeczytałem to upuszczenie przed utworzeniem prac, ale nie lubię robić tego w ten sposób.
IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'MyProc')
DROP PROCEDURE MyProc
GO
CREATE PROCEDURE MyProc
...
Jak mogę dodać sprawdzanie istnienia procedury składowanej i utworzyć ją, jeśli ona nie istnieje, ale zmienić ją, jeśli ona istnieje?
sql
sql-server
tsql
stored-procedures
Shaper
źródło
źródło
Odpowiedzi:
Możesz uruchomić kod proceduralny w dowolnym miejscu, w którym możesz uruchomić zapytanie.
Po prostu skopiuj wszystko po
AS
:Ten kod robi dokładnie to samo, co zrobiłby przechowywany proc, ale nie jest przechowywany po stronie bazy danych.
To bardzo przypomina tak zwaną procedurę anonimową
PL/SQL
.Aktualizacja:
Twój tytuł pytania jest trochę mylący.
Jeśli musisz utworzyć procedurę tylko wtedy, gdy ona nie istnieje, kod jest w porządku.
Oto, co
SSMS
wyprowadza skrypt tworzenia:Aktualizacja:
Przykład, jak to zrobić, dołączając schemat:
W powyższym przykładzie dbo jest schematem.
Aktualizacja:
W SQL Server 2016+ możesz to zrobić
CREATE OR ALTER PROCEDURE dbo.MyProc
źródło
@astander
: możesz również wywoływać anonimowy kod z procedur przechowywanych. Aby użyć ich danych wyjściowych wINSERT
, musisz użyćOPENROWSET
lub,OPENQUERY
który działa również z anonimowym kodem. Oczywiście w anonimowym kodzie występują wady: na przykład działa on tylko z uprawnieniami osoby dzwoniącej. Chodzi mi o to, że jest to możliwy, a nie preferowany sposób robienia rzeczy :)Zdaję sobie sprawę, że zostało to już oznaczone jako odebrane, ale robiliśmy to w ten sposób:
Żeby nie upuścić procedury.
źródło
GRANT
w skrypcie wyrażenia były zrozumiałe na wypadek, gdyby się zmieniły ; więc nadal istnieje uzasadnienie do użyciaDROP
zamiastALTER
.Jeśli szukasz najprostszego sposobu sprawdzenia istnienia obiektu bazy danych przed jego usunięciem, oto jeden ze sposobów (przykład wykorzystuje SPROC, tak jak twój przykład powyżej, ale można go zmodyfikować dla tabel, indeksów itp.):
Jest to szybkie i eleganckie, ale musisz upewnić się, że masz unikalne nazwy obiektów dla wszystkich typów obiektów, ponieważ nie bierze tego pod uwagę.
Mam nadzieję, że to pomoże!
źródło
Wiem, że chcesz „zmienić procedurę, jeśli istnieje i usunąć ją tylko, jeśli nie istnieje”, ale uważam, że łatwiej jest po prostu zawsze upuścić procedurę, a następnie ponownie ją utworzyć. Oto jak porzucić procedurę tylko wtedy, gdy już istnieje:
Drugi parametr mówi
OBJECT_ID
tylko spojrzeć na obiektach zobject_type = 'P'
, procedur, które są przechowywane:Możesz uzyskać pełną listę opcji poprzez:
źródło
Począwszy od SQL SERVER 2016 możesz używać nowego
DROP PROCEDURE IF EXISTS
.DROP { PROC | PROCEDURE } [ IF EXISTS ] { [ schema_name. ] procedure } [ ,...n ]
Odniesienie: https://msdn.microsoft.com/en-us/library/ms174969.aspx
źródło
Wiem, że jest to bardzo stary post, ale ponieważ pojawia się w najlepszych wynikach wyszukiwania, dlatego dodaje najnowszą aktualizację dla osób korzystających z programu SQL Server 2016 z dodatkiem SP1 -
Powoduje to utworzenie procedury składowanej, jeśli jeszcze nie istnieje, ale zmienia ją, jeśli istnieje.
Odniesienie
źródło
DROP IF EXISTS to nowa funkcja programu SQL Server 2016
https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/
źródło
Miałem ten sam błąd. Wiem, że ten wątek jest już prawie martwy, ale chcę ustawić inną opcję oprócz „anonimowej procedury”.
Rozwiązałem to w ten sposób:
Sprawdź, czy istnieje procedura składowana:
Jednak
"CREATE/ALTER PROCEDURE' must be the first statement in a query batch"
nadal tam jest. Rozwiązałem to w ten sposób:Kończę z tym kodem:
źródło
Oto metoda i uzasadnienie korzystania z niej w ten sposób. Edytowanie przechowywanych proc nie jest tak ładne, ale są plusy i minusy ...
AKTUALIZACJA: Możesz także zawrzeć całe połączenie w TRANSAKCJI. W tym wiele procedur przechowywanych w jednej transakcji, które mogą wszystkie zatwierdzić lub wszystkie wycofać. Kolejną zaletą zawijania transakcji jest to, że procedura przechowywana zawsze istnieje dla innych połączeń SQL, o ile nie używają one poziomu izolacji ODCZYTAJ NIEZGODNĄ Z transakcją!
1) Aby uniknąć zmian po prostu jako decyzja procesowa. Nasze procesy muszą zawsze odbywać się, JEŚLI ISTNIEJE UPADEK, A następnie TWORZENIE. Jeśli zrobisz to samo, zakładając, że nowy PROC jest pożądanym proc, catering na zmiany jest nieco trudniejszy, ponieważ miałbyś JEŚLI ISTNIEJE INNE STWORZENIE.
2) Musisz umieścić CREATE / ALTER jako pierwsze wywołanie wsadowe, aby nie można było zawrzeć sekwencji aktualizacji procedur w transakcji poza dynamicznym SQL. Zasadniczo, jeśli chcesz uruchomić cały stos aktualizacji procedur lub przywrócić je wszystkie bez przywracania kopii zapasowej DB, jest to sposób na zrobienie wszystkiego w jednej partii.
źródło
W Sql server 2008 r. Możesz użyć „
INFORMATION_SCHEMA.ROUTINES
”źródło
Najwyraźniej nie mam reputacji wymaganej do głosowania lub komentowania, ale chciałem tylko powiedzieć, że odpowiedź Geoffa przy użyciu EXEC (sp_executesql może być lepsza) jest zdecydowanie najlepszym rozwiązaniem. Porzucenie, a następnie ponowne utworzenie procedury przechowywanej powoduje, że zadanie zostało wykonane w końcu, ale jest taki moment, że procedura przechowywana w ogóle nie istnieje, a to może być bardzo złe, szczególnie jeśli będzie to coś, co będzie biegać wielokrotnie. Miałem wiele problemów z aplikacją, ponieważ wątek w tle wykonywał IF IFIST DROP ... CREATE w tym samym czasie inny wątek próbował użyć procedury składowanej.
źródło
** Najprostszym sposobem na upuszczenie i odtworzenie przechowywanego proc w T-Sql jest **
źródło
Oto skrypt, którego używam. Dzięki temu unikam niepotrzebnego upuszczania i odtwarzania przechowywanych procesów.
źródło
Sprawdź, czy istnieje procedura składowana
Sprawdź IF Exist dla Trigger, funkcja również klikając poniżej link http://www.gurujipoint.com/2017/05/check-if-exist-for-trigger-function-and.html
źródło
dlaczego nie pójdziesz w prosty sposób
..........
źródło
%
, więcLIKE
zachowuje się jak=
Oprócz odpowiedzi z @Geoff stworzyłem proste narzędzie, które generuje plik SQL, który zawiera instrukcje dla procedur przechowywanych, widoków, funkcji i wyzwalaczy.
Zobacz MyDbUtils @ CodePlex .
źródło
Zastanawiam się! Dlaczego nie piszę całego zapytania jak
Wiem już, że pierwsze dwie procedury już istnieją. SQL uruchomi kwerendę poda błąd pierwszych dwóch procedur, ale nadal utworzy ostatnią procedurę. SQl sam zajmuje się tym, co już istnieje. To właśnie zawsze robię wszystkim klienci!
źródło
UTWÓRZ Procedura, JEŚLI NIE ISTNIEJE „Twoja nazwa-proc” () ROZPOCZNIJ ... KONIEC
źródło