2016-05-19 29 views
1

が2つのデータベース持って名前を変更した場合:SQL Serverのストアドプロシージャのチェック、他のデータベース内のテーブルが存在すると

正しく動作しません
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 

:MAINでMAINとIP2Locationの

を、私は次のストアドプロシージャを持っています:

ことdb11_newが存在しない場合、それは(正確に)それが作成されますが、それが存在する場合..私は

There is already an object named 'db11_new' in the database.

を取得します

したがって、2名の変更と手順の最後でも

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

で何か間違っとがあるようだ私は(常に)それが問題らしい

Msg 15248, Level 11, State 1, Procedure sp_rename, Line 359 Either the parameter @objname is ambiguous or the claimed @objtype (OBJECT) is wrong.

がSPROCためである以下の答えを得ますip2location DBではなく他のデータベースに格納されています。

は、すべてのsprocsをMAIN DBに保存することを考慮して解決策を提案することができます。

ありがとうございました

+0

そして、何db11_old' 'はどう?これは、それは誤りその 'sb11_old'alreadyプレゼントに落ちる二度目のSP実行しようとしたとき、それはテーブル' db11_old'を作成し、この手順を実行している最初の時間の後。 – gofr1

答えて

1
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')) 

あなたの分析が正しいです。 sys.objectsカタログビューは、現在のデータベースコンテキスト(MAIN)のオブジェクトを返します。あなただけの3部構成の名前(ip2location.sys.objects)を使用することもできますが、私はあなたが単にNULLOBJECT_ID関数の結果をチェックお勧め:私は(CSVアップロードせずに)このクエリをテストしている

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; 
+0

:-(両方のケースでは動作しませんとしても? はどのようsp_renameをの問題を修正することができ感謝 – Joe

+0

が見つかり:: 'EXEC ip2location.dbo.sp_rename N'dbo作業中 ' ip2location.sys.objectは..とにかく..それはOKだ '.......いないようです!.db11' 、N'db11_old'' – Joe

1

sys.objectsとsp_renameはローカルオブジェクトです。たぶんそれはあなたが現在のものよりも、別のデータベースで物事を行うたいとき、あなたはあなたを書くことができ、また...

を助け

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

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

: ことは、これを使用してみてください動的SQLのコードを作成し、他のデータベースで直接実行します。

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

+0

こんにちは!回答ありがとうございますが、私はすでに "ip2location"を追加しようとしました。いくつかの場所で、あなたが示唆したが、それはうーん... 'OBJECT_ID(N '[IP2Locationの]。[DBO]。[db11_new]'、 'U')はNULL' IS – Joe

0

まずI

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 

最初の実行:ip2locationへのすべての参照を削除

私はdb11*テーブルがありません。実行は私をもたらします:

Msg 15248, Level 11, State 1, Procedure sp_rename, Line 401 [Batch Start Line 2] Either the parameter @objname is ambiguous or the claimed @objtype (OBJECT) is wrong. Caution: Changing any part of an object name could break scripts and stored procedures.

db11_newが作成されたことを意味し、そしてよりはdb11に名前を変更しますが、db11_oldが見つかりませんでしたので、私はこのエラーを得たこと。私は私のDBにdb11テーブルを取得します。

セカンドラン:

Caution: Changing any part of an object name could break scripts and stored procedures. Caution: Changing any part of an object name could break scripts and stored procedures.

すべてが作成され、名前が変更されたことを意味します。

3回目:

Msg 15335, Level 11, State 1, Procedure sp_rename, Line 509 [Batch Start Line 2] Error: The new name 'db11_old' is already in use as a OBJECT name and would cause a duplicate that is not permitted. Msg 15335, Level 11, State 1, Procedure sp_rename, Line 509 [Batch Start Line 2] Error: The new name 'db11' is already in use as a OBJECT name and would cause a duplicate that is not permitted.

だから、すべての次の再実行あなたは、これと同じエラーが発生します。

私の提案はdb11_oldについて何かをすることです。

+0

こんにちは答えるためのおかげで、私の分析はほとんど差です:とにかく、sys.objectとsp_renameを、両方のステートメントの前にip2.location.dboを追加する必要があり、ローカルオブジェクトなので I。誰かにとって有益な場合は、できるだけ早く完全なソリューションを公開します – Joe

0

ここReboonとダン・グスマンのおかげで解決、少し改善:

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 
関連する問題