web-dev-qa-db-ja.com

SQL Azure-データベース間でテーブルをコピーする

次のSQLを実行しようとしています:

INSERT INTO Suppliers ( [SupplierID], [CompanyName]) 
Select  [SupplierID], [CompanyName] From [AlexDB]..Suppliers

そして、「データベースやサーバー名への参照は、このバージョンのSQLサーバーではサポートされていません」というエラーを受け取りました。

サーバー内部のデータベース間でデータをコピーする方法はありますか?データをクライアントにロードしてからサーバーに戻すことができますが、これは非常に遅いです。

28
Alex Dybenko

これは古いことはわかっていますが、1回限りの実行のための別の手動ソリューションがありました。

SQL Management Studio R2 SP1を使用してAzureに接続し、ソースデータベースを右クリックして[スクリプトの生成]を選択します。

ウィザードで、テーブルを選択した後、クエリウィンドウに出力するテーブルを選択し、[詳細]をクリックします。プロパティウィンドウの半分ほど下には、「スクリプトを作成するデータの種類」のオプションがあります。それを選択して「データのみ」に変更し、ウィザードを終了します。

次に行うのは、スクリプトを確認し、挿入の制約を再配置し、ターゲットDBに対して実行するように上部のを変更することだけです。

次に、ターゲットデータベースを右クリックして新しいクエリを選択し、スクリプトをそれにコピーして実行します。

完了、データが移行されました。

それが誰かを助けることを願っています

65
Mark Jones

2015年以降、これは エラスティックデータベースクエリクロスデータベースクエリ とも呼ばれます。

このテンプレートを作成して使用したところ、20分間で150万行がコピーされました。

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';

CREATE DATABASE SCOPED CREDENTIAL SQL_Credential  
WITH IDENTITY = '<username>',
SECRET = '<password>';

CREATE EXTERNAL DATA SOURCE RemoteReferenceData
WITH
(
    TYPE=RDBMS,
    LOCATION='<server>.database.windows.net',
    DATABASE_NAME='<db>',
    CREDENTIAL= SQL_Credential
);

CREATE EXTERNAL TABLE [dbo].[source_table] (
    [Id] BIGINT NOT NULL,
    ...
)
WITH
(
    DATA_SOURCE = RemoteReferenceData
)

SELECT *
 INTO target_table
FROM source_table
17
Magu

残念ながら、これを単一のクエリで行う方法はありません。

これを実現する最も簡単な方法は、「データ同期」を使用してテーブルをコピーすることです。これの利点は、サーバー間でも機能し、テーブルの同期を保つことです。

http://Azure.Microsoft.com/en-us/documentation/articles/sql-database-get-started-sql-data-sync/

実際には、本番環境で「Data Sync」を実行した経験はそれほどありませんが、1回限りの仕事では問題ありません。

「データ同期」の1つの問題は、データベースに多数の「同期」オブジェクトが作成され、Azureポータルから実際の「データ同期」を削除すると、それらがクリーンアップされる場合とクリーンアップされない場合があります。この記事の指示に従って、すべてを手動でクリーンアップします。

https://msgooroo.com/GoorooTHINK/Article/15141/Removing-SQL-Azure-Sync-objects-manually/5215

7

SQL-AzureはUSEステートメントをサポートしておらず、実質的にクロスDBクエリをサポートしていません。したがって、上記のクエリは失敗するはずです。

Dbを別のsql Azure dbにコピー/バックアップする場合は、SQL-Azureで「同じサーバー」コピーまたは「クロスサーバー」コピーを使用できます。 このmsdn記事を参照

3
IUnknown

Red-Gate Softwareの SQL Data Compare のようなツールを使用して、データベースのコンテンツをある場所から別の場所に移動でき、SQL Azureを完全にサポートできます。 14日間の無料トライアルで、必要なことができるかどうかを確認できます。

完全な開示:私はRed Gate Softwareで働いています

3

次の手順を使用します。これを行う簡単な方法はありません。しかし、いくつかのトリックによって可能です。

ステップ1:[AlexDB]内に、Suppliersテーブルと同じ構造の別の1つのテーブルを作成し、それをSuppliersBackupと言います。

ステップ2:DesiredDB内に、Suppliersテーブルと同じ構造のテーブルを作成します。

ステップ3:AlexDB..SuppliersとDesiredDB..Suppliers間のデータ同期を有効にする

ステップ4:AlexDB..Suppliersからデータを切り捨てます

ステップ5:データをAlexDB..SuppliersBackupからAlexDB..Suppliersにコピーします

ステップ6:同期を実行します

DesiredDBにコピーされたデータ。

3
Vignesh M

古い投稿ですが、別のオプションは SQL Azure移行ウィザード です。

2
ozz

Sp_addlinkedsrvloginが含まれているonpremバージョンがある場合は、ソースデータベースとターゲットデータベースの両方にリンクサーバーを設定してから、クエリへの挿入を実行できます。

このブログの「Windows Azure SQLデータベースに対するリンクサーバーと分散クエリのSQL Serverサポート」を参照してください。 https://Azure.Microsoft.com/en-us/blog/announcing-updates-to-windows-Azure -sql-database /

2
Thomas

わかりました、私は答えを見つけたと思います-方法はありません。クライアントにデータを移動するか、他のいくつかのトリックを実行する必要があります。説明付きの記事へのリンク: SQL Azureの制限:接続ごとに1つのDBのみ しかし、他のアイデアは大歓迎です!

1
Alex Dybenko

SSMS SQL Serverのインポートおよびエクスポート機能をお勧めします。この機能は、複数の接続構成と、選択したテーブルのサーバー間コピーをサポートしています。 .NET Sql Serverコネクタを試しました。これは、Azure SQLデータベースで非常にうまく機能します。

0
hui chen

いくつかのオプション(むしろ回避策):

  1. データを含むスクリプトを生成する
  2. Azureでデータ同期を使用する
  3. MS Accessを使用(インポートしてからエクスポート)し、多くの除外(AccessではGUID)など)
  4. Red Gateなどのサードパーティツールを使用します。

残念ながら、これまでのところ簡単で組み込みの方法はありません。

0
Vad