web-dev-qa-db-ja.com

2つの異なるサーバーデータベースからINSERT INTO

testdabse.invoiceテーブルのデータをbasecampdev.invoiceテーブルにコピーしようとしています。 testdabseはローカルデータベースですが、basecampdevはサーバー内にあります。

データを別のテーブルにコピーするためのクエリが機能しない、と言う

Invalid object name 'basecampdev.dbo.invoice'.  

私はこれを読んでいます ドキュメント .

これらはサーバーから提供される情報です

Server type: Database Engine
Server name: server.database.windows.net (this is not the real name)
Authentication: SQL Server Authentication
Login: myusername
Password: mypassword  

このクエリを実行できるようにサーバーに接続するにはどうすればよいですか

INSERT INTO [basecampdev].[dbo].[invoice]
           ([InvoiceNumber]
           ,[TotalAmount]
           ,[IsActive]
           ,[CreatedBy]
           ,[UpdatedBy]
           ,[CreatedDate]
           ,[UpdatedDate]
           ,[Remarks])
SELECT [InvoiceNumber]
           ,[TotalAmount]
           ,[IsActive]
           ,[CreatedBy]
           ,[UpdatedBy]
           ,[CreatedDate]
           ,[UpdatedDate]
           ,[Remarks] FROM [testdabse].[dbo].[invoice]

スクリーンショット

enter image description here

18
fiberOptics

SQL Server でリンクされたデータベースサーバーを作成およびクエリする必要があるようです

現時点では、3つの部分名mydatabase.dbo.mytableを使用して異なるデータベース間で行われるクエリを作成しましたが、レベルを上げて4つの部分名myserver.mydatabase.dbo.mytableを使用する必要があります。 詳細については、4つの部分の命名に関するこの投稿

編集
既存のクエリの4つの部分の名前は、次のようになります(既に試したことがあると思われますか?)ホストファイルを編集するか、サーバーを登録するか、database.windows.netの場所を特定する必要があります。

INSERT INTO [DATABASE.WINDOWS.NET].[basecampdev].[dbo].[invoice]
       ([InvoiceNumber]
       ,[TotalAmount]
       ,[IsActive]
       ,[CreatedBy]
       ,[UpdatedBy]
       ,[CreatedDate]
       ,[UpdatedDate]
       ,[Remarks])
SELECT [InvoiceNumber]
       ,[TotalAmount]
       ,[IsActive]
       ,[CreatedBy]
       ,[UpdatedBy]
       ,[CreatedDate]
       ,[UpdatedDate]
       ,[Remarks] FROM [BC1-PC].[testdabse].[dbo].[invoice]

リモートサーバーにアクセスできない場合は、 リンクデータベースサーバー を作成できるかどうかを確認します。

EXEC sp_addlinkedserver [database.windows.net];
GO
USE tempdb;
GO
CREATE SYNONYM MyInvoice FOR 
    [database.windows.net].basecampdev.dbo.invoice;
GO

次に、完全な4部名を必要とせずにMyEmployeeに対してクエリを実行できます

17
Simon Martin

サイモンによって与えられた答えは私のためにうまくいきますが、あなたは正しい順序でそれをしなければなりません:まず、あなたがあなたの[DATABASE.WINDOWS.NET]。[basecampdev]であるデータを挿入したいサーバーにいる必要があります場合。

請求書テーブルからいくつかのデータを選択して、アクセスできることを確認できるかどうかを確認できます。

Select top 10 * from [DATABASE.WINDOWS.NET].[basecampdev].[dbo].[invoice]

次に、Simonが指定したクエリを実行して、別のサーバーにリンクします。今回は他のサーバーを使用します。

EXEC sp_addlinkedserver [BC1-PC]; -- this will create a link tempdb that you can access from where you are
GO
USE tempdb;
GO
CREATE SYNONYM MyInvoice FOR 
    [BC1-PC].testdabse.dbo.invoice; -- Make a copy of the table and data that you can use
GO

次に、挿入ステートメントを実行します。

INSERT INTO [DATABASE.WINDOWS.NET].[basecampdev].[dbo].[invoice]
       ([InvoiceNumber]
       ,[TotalAmount]
       ,[IsActive]
       ,[CreatedBy]
       ,[UpdatedBy]
       ,[CreatedDate]
       ,[UpdatedDate]
       ,[Remarks])
SELECT [InvoiceNumber]
       ,[TotalAmount]
       ,[IsActive]
       ,[CreatedBy]
       ,[UpdatedBy]
       ,[CreatedDate]
       ,[UpdatedDate]
       ,[Remarks] FROM MyInvoice

お役に立てれば!

3
Blue Bamboo

ソースデータベースがリンクサーバーにない場合、テーブルを別のデータベースからターゲットサーバーデータベースに直接コピーすることはできません。ただし、目的のテーブルのスクリプト(データを含むスキーマ)をソースサーバーDBで一時的に1つのテーブルに生成し、宛先サーバーDBでスクリプトを実行して、データを含むテーブルを作成する1つの方法があります。最後に、INSERT INTO [DESTINATION_TABLE] select * from [TEMPORARY_SOURCE_TABLE]を使用します。宛先テーブルにデータを取得した後、一時テーブルを削除します。

私は同じ状況に直面したときにこの解決策を見つけました。これがあなたにも役立つことを願っています。

2
Raja Sekhar
USE [mydb1]

SELECT *
INTO mytable1
FROM OPENDATASOURCE (
        'SQLNCLI'
        ,'Data Source=XXX.XX.XX.XXX;Initial Catalog=mydb2;User ID=XXX;Password=XXXX'
        ).[mydb2].dbo.mytable2
    /*  steps - 
            1-  [mydb1] means our opend connection database 
            2-  mytable1 means create copy table in mydb1 database where we want insert record
            3-  XXX.XX.XX.XXX - another server name.
            4-  mydb2 another server database.
            5-  write User id and Password of another server credential
            6-  mytable2 is another server table where u fetch record from it. */
2
Sagar Mahajan

リモートオブジェクトに CREATE SYNONYM を使用できます。

0
Serg