1

2 つのデータベースがある: MAIN と IP2LOCATION

MAIN には、次のストアド プロシージャがあります。

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

それは正しく動作しません:

db11_new が存在しない場合は (正しく) 作成されますが、存在する場合は..

データベースには「db11_new」という名前のオブジェクトがすでに存在します。

したがって、何か問題があるようです

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

また、2 Renameの手順の最後に、(常に)次の回答が得られます

メッセージ 15248、レベル 11、状態 1、プロシージャ sp_rename、行 359 パラメータ @objname があいまいであるか、要求された @objtype (OBJECT) が間違っています。

問題は、sprocがip2location DBではなく別のデータベースに保存されているためです..

すべてのsprocをMAIN DBに保持したいので、解決策を提案できますか?

ありがとう

4

4 に答える 4

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

于 2016-05-19T11:35:15.450 に答える
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を確認することをお勧めします。NULL 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;
于 2016-05-19T12:23:32.897 に答える
0

Reboon と Dan Guzman のおかげで、解決策はほとんど改善されませんでした:

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
于 2016-05-19T15:35:23.797 に答える
0

このクエリをテストしました (csv アップロードなし)

最初に、次へのすべての参照を削除します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

ファーストラン:

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

メッセージ 15248、レベル 11、状態 1、プロシージャ sp_rename、行 401 [バッチ開始行 2] パラメータ @objname があいまいであるか、要求された @objtype (OBJECT) が間違っています。注意: オブジェクト名の一部を変更すると、スクリプトやストアド プロシージャが破損する可能性があります。

つまり、db11_newが作成され、 で名前が変更されましdb11db11_oldが、見つからなかったため、このエラーが発生しました。db11DBにテーブルを取得します。

2 回目の実行:

注意: オブジェクト名の一部を変更すると、スクリプトやストアド プロシージャが破損する可能性があります。注意: オブジェクト名の一部を変更すると、スクリプトやストアド プロシージャが破損する可能性があります。

つまり、すべてが作成され、名前が変更されました。

3 回目の実行:

メッセージ 15335、レベル 11、状態 1、プロシージャ sp_rename、行 509 [バッチ開始行 2] エラー: 新しい名前 'db11_old' はオブジェクト名として既に使用されており、許可されていない重複が発生します。メッセージ 15335、レベル 11、状態 1、プロシージャ sp_rename、行 509 [バッチ開始行 2] エラー: 新しい名前 'db11' はオブジェクト名として既に使用されており、許可されていない重複が発生する可能性があります。

したがって、次に再実行するたびに、これと同じエラーが発生します。

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

于 2016-05-19T13:54:46.433 に答える