Löschen und neu erstellen zu Verfahren, wenn es vorhanden ist, in T-SQL nicht funktioniert
IF EXISTS ( SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'LOCATION') AND type IN (N'P', N'PC'))
DROP PROCEDURE [dbo].[LOCATION]
GO
CREATE PROCEDURE [dbo].[LOCATION]
@IP NVARCHAR(100)
AS
BEGIN
DECLARE @IPNumber BIGINT
SELECT @IPNumber = dbo.ConvertIp2Num(@IP)
SELECT [country_code],[country_name]
FROM [myDatabase].[dbo].[CountryIP]
WHERE @IPNumber BETWEEN ip_from AND ip_to
END
Habe ich den oben genannten code, um zu überprüfen, ob die gespeicherte Prozedur LAGE in der aktuellen Datenbank vorhanden. Ich erwarte, dass es zu löschen und neu zu erstellen das Verfahren, wenn es vorhanden ist.
Jedoch, ob die Prozedur vorhanden ist, wird der code noch ausgeführt und als Ergebnis erhalte ich die Fehlermeldung 'Es ist bereits ein Objekt mit dem Namen 'ORT' in der Datenbank.'
Warum ist der code fehlschlagen, um die drop-Prozedur, falls es existiert?
Den gleichen code funktioniert für ein weiteres Verfahren in der gleichen Datenbank.
- versuchen
object_id = OBJECT_ID(N'[dbo].[MSL_GET_IP_LOCATION]')
- gleichen Fehler. Der gleiche code funktioniert ordnungsgemäß für ein weiteres Verfahren in der gleichen Datenbank.
- Tut
select
Gegenzug nichts, wenn du ausschließenAND type IN (N'P', N'PC')
? - ja die SELECT gibt 1 Zeile mit den details der gespeicherten Prozedur.
- Das deutet darauf hin, dass das Objekt in Frage ist nicht eine gespeicherte Prozedur - vielleicht der name wurde verwendet für eine Benutzer-definierte Funktion? Beachten Sie, dass die Fehlermeldung sagt nur "ein Objekt", aber Sie ist vage, um welche Art von Objekt die vorhandenen ein ist.
- aber wenn ich die Auswahl in der, WENN VORHANDEN, Zeile return 'SQL_STORED_PROCEDURE' für Spalte type_desc?
- Na, dann ist das Problem woanders liegt dann - wenn ich den genauen code, den Sie gepostet haben, tauschen Sie das Gehäuse des Verfahrens mit einer einfachen
print
(da ich nicht Ihre Funktion oder Tabellen) und führen Sie es wiederholt, es läuft wunderbar - also das problem ist woanders im code haben Sie nicht gezeigt. - Was sind die Werte, die in
type
undtype_desc
Spalten wenn Sie denselect
ohne dieand
? - Nach etwas mehr testen, die Skripte erfolgreich ausgeführt werden wie erwartet, wenn unabhängig, aber ich brauche führen Sie Sie in einer Skript-Datei. Also in der Skript-Datei, der erste drop und erstellen Sie die gespeicherte Prozedur erfolgreich ausgeführt wird, Folgeanträge scheitern. Wenn ich 'MSL_GET_IP_LOCATION' drop und Erstellung der ersten in die Skript-Datei, es läuft auch erfolgreich und die nachfolgenden wurde erfolgreich ausgeführt, wenn es war, an der Spitze der Skript-Datei wird nun fehlschlagen.
- Typ P gibt und type_desc gibt SQL_STORED_PROCEDURE
- OK, sieht aus wie ich es geschafft habe, wenn ich GEHEN nach BEGINNEN .....ENDE auf alle Verfahren, die Definitionen, die Sie alle erfolgreich ausgeführt.
- Möglich, Duplikat der Wie um zu überprüfen, ob eine gespeicherte Prozedur vorhanden ist, bevor Sie ihn erstellen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen, diese (bevorzugte Methode, um mithilfe einer Ansicht):
oder diese (nicht zu empfehlen mit direkten Zugang zu einer system-Tabelle):
Warum die erste Methode wird bevorzugt, können Sie zum Beispiel erfahren, in dieser Frage: SQL-Server: sollte ich die information_schema-Tabellen über sys-Tabellen?
Dies ist eine Art von spät, aber andere, die am Ende hier vielleicht prüfen wollen, die MSDN-Dokumentation, die sagen, Sie verwenden könnten:
Dies ist jedoch vom SQL Server-2016 Community Technology Preview 3.3 (CTP 3.3).
Den Sie verwenden könnten:
Weitere Gedanken zu diesem ist, müssen Sie sicherstellen, dass Sie eindeutige Namen haben über alle Objekte.