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ßen AND 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 und type_desc Spalten wenn Sie den select ohne die and ?
  • 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

InformationsquelleAutor StackTrace | 2014-10-30
Schreibe einen Kommentar