sql server gespeicherte Prozedur überprüfen, ob Tabelle in einer anderen database existiert und umbenennen

Haben Sie 2 databaseen: MAIN und IP2LOCATION

in MAIN habe ich folgendes gespeichert:

CREATE PROCEDURE dbo.Update_IP2Location_DB11_from_CSV AS BEGIN IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[ip2location].[dbo].[db11_new]') AND type in (N'U')) BEGIN CREATE TABLE [ip2location].[dbo].[db11_new] ( [ip_from] bigint NOT NULL, [ip_to] bigint NOT NULL, [country_code] nvarchar(2) NOT NULL, [country_name] nvarchar(64) NOT NULL, [region_name] nvarchar(128) NOT NULL, [city_name] nvarchar(128) NOT NULL, [latitude] float NOT NULL, [longitude] float NOT NULL, [zip_code] nvarchar(30) NOT NULL, [time_zone] nvarchar(8) NOT NULL, ) ON [PRIMARY] CREATE INDEX [ip_from] ON [ip2location].[dbo].[db11_new]([ip_from]) END ELSE BEGIN DELETE FROM [ip2location].[dbo].[db11_new] END BULK INSERT [ip2location].[dbo].[db11_new] FROM 'D:\IP2LOCATION-LITE-DB11.CSV' WITH ( FORMATFILE = 'C:\inetpub\wwwroot\ws\DB11_ip4.FMT') EXEC sp_rename N'dbo.db11', N'db11_old', 'OBJECT' EXEC sp_rename N'ip2location.dbo.db11_new', N'db11', 'OBJECT' END 

das funktioniert nicht richtig:

Wenn db11_new nicht existiert, schafft es (richtig) es, aber wenn es existiert .. bekomme ich

Es gibt bereits ein object namens 'db11_new' in der database.

also scheint es da ist etwas falsch in

 IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[ip2location].[dbo].[db11_new]') AND type in (N'U')) 

und auch am Ende des Verfahrens mit dem 2 Umbenennen bekomme ich (immer) die folgende Antwort

Msg 15248, Level 11, State 1, Prozedur sp_rename, Zeile 359 Entweder ist der Parameter @objname mehrdeutig oder der beanspruchte @objtype (OBJECT) ist falsch.

es scheint Problem ist, weil die Sproc nicht in ip2location DB gespeichert ist, sondern in einer anderen database ..

kann eine Lösung vorschlagen, wenn man bedenkt, dass ich es vorziehe, alle Sprocs in der MAIN DB zu behalten, da alle anderen dort?

Vielen Dank

     therefore it seems there is something wrong in IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[ip2location].[dbo].[db11_new]') AND type in (N'U')) 

    Ihre Analyse ist richtig. Die sys.objects-Katalogansicht gibt objecte im aktuellen databasekontext ( MAIN ) zurück. Obwohl du nur einen 3-teiligen Namen ( ip2location.sys.objects ) verwenden ip2location.sys.objects , schlage ich vor, dass du einfach nach einem NULL OBJECT_ID functionsergebnis OBJECT_ID :

     IF OBJECT_ID(N'[ip2location].[dbo].[db11_new]', 'U') IS NULL BEGIN CREATE TABLE [ip2location].[dbo].[db11_new] ( [ip_from] bigint NOT NULL, [ip_to] bigint NOT NULL, [country_code] nvarchar(2) NOT NULL, [country_name] nvarchar(64) NOT NULL, [region_name] nvarchar(128) NOT NULL, [city_name] nvarchar(128) NOT NULL, [latitude] float NOT NULL, [longitude] float NOT NULL, [zip_code] nvarchar(30) NOT NULL, [time_zone] nvarchar(8) NOT NULL, ) ON [PRIMARY]; CREATE INDEX [ip_from] ON [ip2location].[dbo].[db11_new]([ip_from]); END; ELSE BEGIN DELETE FROM [ip2location].[dbo].[db11_new]; END; 

    sys.objects und sp_rename sind lokale objecte. Versuchen Sie, dies zu benutzen:

     IF NOT EXISTS (SELECT * FROM ip2location.sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[db11_new]') AND type in (N'U')) 

    und

      EXEC ip2location.sp_rename N'dbo.db11_new', N'db11', 'OBJECT' 

    Vielleicht hilft es…

    Alternativ, wenn Sie Dinge in einer anderen database als die aktuelle tun wollen, können Sie schreiben Sie Code in dynamischen SQL und dann führen Sie es direkt in der anderen database.

    https://msdn.microsoft.com/en-us/library/ms188001.aspx

    Ich habe diese Abfrage getestet (ohne csv-Upload)

    Zuerst beseitige ich jeden Verweis auf ip2location :

     CREATE PROCEDURE dbo.Update_IP2Location_DB11_from_CSV AS BEGIN IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'dbo.db11_new') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[db11_new] ( [ip_from] bigint NOT NULL, [ip_to] bigint NOT NULL, [country_code] nvarchar(2) NOT NULL, [country_name] nvarchar(64) NOT NULL, [region_name] nvarchar(128) NOT NULL, [city_name] nvarchar(128) NOT NULL, [latitude] float NOT NULL, [longitude] float NOT NULL, [zip_code] nvarchar(30) NOT NULL, [time_zone] nvarchar(8) NOT NULL, ) ON [PRIMARY] CREATE INDEX [ip_from] ON [dbo].[db11_new]([ip_from]) END ELSE BEGIN DELETE FROM [dbo].[db11_new] END BULK INSERT [dbo].[db11_new] FROM 'D:\IP2LOCATION-LITE-DB11.CSV' WITH ( FORMATFILE = 'C:\inetpub\wwwroot\ws\DB11_ip4.FMT') EXEC sp_rename N'dbo.db11', N'db11_old', 'OBJECT' EXEC sp_rename N'dbo.db11_new', N'db11', 'OBJECT' END GO 

    Erster Lauf:

    Ich habe keine db11* Ausführung bringt mich:

    Msg 15248, Level 11, State 1, Prozedur sp_rename, Zeile 401 [Batch Start Line 2] Entweder ist der Parameter @objname mehrdeutig oder der beanspruchte @objtype (OBJECT) ist falsch. Achtung: Das Ändern eines Teils eines objectnamens kann Skripts und gespeicherte Prozeduren brechen.

    Das bedeutet, dass db11_new erstellt wurde, und als in db11 umbenannt, aber db11_old wurde nicht gefunden, also habe ich diesen Fehler bekommen. Ich bekomme db11 Tabelle in meinem DB.

    Zweiter Lauf:

    Achtung: Das Ändern eines Teils eines objectnamens kann Skripts und gespeicherte Prozeduren brechen. Achtung: Das Ändern eines Teils eines objectnamens kann Skripts und gespeicherte Prozeduren brechen.

    Das heißt, alles wurde erstellt und umbenannt.

    Dritter Lauf:

    Msg 15335, Level 11, State 1, Prozedur sp_rename, Zeile 509 [Batch Start Line 2] Fehler: Der neue Name 'db11_old' wird bereits als OBJECT-Name verwendet und würde ein Duplikat verursachen, das nicht erlaubt ist. Msg 15335, Level 11, State 1, Prozedur sp_rename, Zeile 509 [Batch Start Line 2] Fehler: Der neue Name 'db11' wird bereits als OBJECT-Name verwendet und würde ein Duplikat verursachen, das nicht erlaubt ist.

    Also jedes nächste re-run Sie erhalten diese gleichen Fehler.

    Mein Vorschlag ist, etwas über db11_old zu tun.

    Danke an Reboon und Dan Guzman hier die Lösung, wenig verbessert:

     CREATE PROCEDURE dbo.spA_Update_IP2Location_DB11_from_CSV AS BEGIN IF OBJECT_ID(N'[ip2location].[dbo].[db11_new]', 'U') IS NULL BEGIN CREATE TABLE [ip2location].[dbo].[db11_new]( [ip_from] bigint NOT NULL, [ip_to] bigint NOT NULL, [country_code] nvarchar(2) NOT NULL, [country_name] nvarchar(64) NOT NULL, [region_name] nvarchar(128) NOT NULL, [city_name] nvarchar(128) NOT NULL, [latitude] float NOT NULL, [longitude] float NOT NULL, [zip_code] nvarchar(30) NOT NULL, [time_zone] nvarchar(8) NOT NULL, ) ON [PRIMARY] CREATE INDEX [ip_from] ON [ip2location].[dbo].[db11_new]([ip_from]) ON [PRIMARY] END ELSE BEGIN delete from [ip2location].[dbo].[db11_new] END BULK INSERT [ip2location].[dbo].[db11_new] FROM 'D:\IP2LOCATION-LITE-DB11.CSV' WITH ( FORMATFILE = 'C:\inetpub\wwwroot\ws\DB11_ip4.FMT' ) BEGIN TRANSACTION EXEC ip2location.dbo.sp_rename N'dbo.db11', N'db11_old' EXEC ip2location.dbo.sp_rename N'dbo.db11_new', N'db11' IF OBJECT_ID(N'[ip2location].[dbo].[db11_old]', 'U') IS NOT NULL BEGIN DROP TABLE ip2location.dbo.db11_old END COMMIT TRANSACTION END