前回の記事で、次のことを示しました。
テーブル値関数の出力をSQLテーブルに挿入します。
リモートデータベースサーバーで作成されたテーブル値関数の出力を挿入します。
この記事では、次のことを説明します。
異なるスキーマで作成された2つのテーブル間でデータをコピーします。
同じサーバー上の異なるデータベースで作成された2つのテーブル間でデータをコピーします。
異なるデータベースに作成された2つのテーブル間でデータをコピーすると、異なるサーバーが存在します(クロスサーバークエリ)
異なるスキーマで作成された2つのテーブル間でデータを転送します。
異なるスキーマで作成された2つのテーブル間でデータをコピーするには、次の構文を使用する必要があります。
INSERT INTO 。(COLUMN1、COLUMN2、COLUMN3 ..)SELECT COLUMN1、COLUMN2、COLUMN3FROM。
デモンストレーションには、 WideWorldImportors を使用します データベース。 [アプリケーション]。[人] からすべてのレコードをコピーしたい [dbo]。[EmployeesWithoutLogonName] へのテーブル LOGONNAMEが「ログオンなし 」に等しいテーブル 。」
まず、[アプリケーション]。[人] のデータを確認しましょう テーブル。これを行うには、次のクエリを実行します。
SELECT [PERSONID]、[FULLNAME]、[PREFERREDNAME]、[SEARCHNAME]、[LOGONNAME]、[PHONENUMBER]、[FAXNUMBER]、[EMAILADDRESS] FROM APPLICATION.PEOPLE WHERE LOGONNAME ='NO LOGON'
次に、出力のスクリーンショットを示します。
それでは、[dbo]。[EmployeesWithoutLogonName] を作成しましょう テーブル。これを行うには、次のクエリを実行します。
CREATE TABLE EMPLOYEESWITHOUTLOGONNAME([ID] INT IDENTITY(1、1)、[FULL_NAME] VARCHAR(500)、[PREFERRED_NAME] VARCHAR(500)、[SEARCH_NAME] NVARCHAR(MAX)、[LOGON_NAME] VARCHAR(250)、 [PHONE_NUMBER] VARCHAR(50)、[FAX_NUMBER] VARCHAR(100)、[EMAIL_ADDRESS] NVARCHAR(250))
次に、[アプリケーション]。[人] からレコードをコピーしましょう。 [dbo]。[EmployeesWithoutLogonName] 。これを行うには、次のクエリを実行します。
INSERT INTO [DBO]。[EMPLOYEESWITHOUTLOGONNAME]([FULL_NAME]、[PREFERRED_NAME]、[SEARCH_NAME]、[LOGON_NAME]、[PHONE_NUMBER]、[FAX_NUMBER]、[EMAIL_ADDRESS])SELECT [FULLNAME]、[PREFERREDNAME]、 [SEARCHNAME]、[LOGONNAME]、[PHONENUMBER]、[FAXNUMBER]、[EMAILADDRESS] FROM APPLICATION.PEOPLE WHERE LOGONNAME ='NO LOGON'
データが挿入されたら、次のクエリを実行して、データがコピーされたことを確認します。
SELECT * FROM EMPLOYEESWITHOUTLOGONNAME
出力は次のとおりです。
異なるデータベースで作成された2つのテーブル間でデータをコピーする
上で説明したように、2つの異なるスキーマで作成されたテーブル間でデータをコピーできます。同様に、2つの異なるデータベースで作成された2つのテーブル間でデータをコピーできます。 2つのデータベース間でデータをコピーするには、ユーザーは「 db_datareader 」を持っている必要があります 」ソースデータベースに対する権限と「db_datawriter 宛先データベースの」。
構文は次のとおりです。
INSERT INTO。。(COLUMN1、COLUMN2、COLUMN3 ..)SELECT COLUMN1、COLUMN2、COLUMN3FROM。。
これを示すために、「HR」という名前の新しいデータベースを作成しました。データベースを作成するには、次のコマンドを実行します。
CREATE DATABASE HR
ここで、 EmployeesWithoutLogonName のデータをコピーします WideWorldImportors で作成されたテーブル 「従業員 」へのデータベース 」HR で作成されたテーブル データベース。
まず、「従業員 」という名前のテーブルを作成しましょう 」HR データベース。これを行うには、次のクエリを実行します。
USE HR GO CREATE TABLE EMPLOYEES([ID] INT IDENTITY(1、1)、[FULL_NAME] VARCHAR(500)、[PREFERRED_NAME] VARCHAR(500)、[SEARCH_NAME] NVARCHAR(MAX)、[LOGON_NAME] VARCHAR( 250)、[PHONE_NUMBER] VARCHAR(50)、[FAX_NUMBER] VARCHAR(100)、[EMAIL_ADDRESS] NVARCHAR(250))
次に、「 EmployeesWithoutLogonName 」からデータをコピーします 」の表を「従業員 」に 」テーブルで、次のクエリを実行してみましょう:
INSERT INTO HR.DBO.EMPLOYEES([FULL_NAME]、[PREFERRED_NAME]、[SEARCH_NAME]、[LOGON_NAME]、[PHONE_NUMBER]、[FAX_NUMBER]、[EMAIL_ADDRESS])SELECT FULL_NAME、PREFERRED_NAME、SEARCH_NAME、LOGON_NAME、PHONE_NUMBER、 FAX_NUMBER、EMAIL_ADDRESS FROM WIDEWORLDIMPORTERS.DBO.EMPLOYEESWITHOUTLOGONNAME
データが挿入されたら、次のクエリを実行して、データがコピーされたことを確認します。
SELECT * FROM HR.DBO.EMPLOYEES
出力は次のとおりです。
異なるサーバー上の異なるデータベースで作成された2つのテーブル間でデータをコピーします
同様に、2つの異なるサーバーで作成された2つの別々のデータベースで作成された2つのテーブル間でデータをコピーできます。これは、リンクサーバー を使用して実行できます またはOPENROWSET キーワード。
リンクサーバーを使用してリモートサーバー上に作成されたSQLデータベースを接続するための構文は次のとおりです。
INSERT INTO。。。(COLUMN1、COLUMN2、COLUMN3 ..)SELECT COLUMN1、COLUMN2、COLUMN3FROM。。>
このデモでは、従業員 のデータをコピーします Employeesデータベースで作成されたテーブルからAzureクラウドで作成されたSQLデータベースへ。これを行うには、最初にAzureSQLインスタンスでデータベースを作成します。 「companyemployees.database.windows.net。 」という名前のSQLサーバーリソースプールを作成しました。 」
次に、AzureデータベースインスタンスにHRデータベースを作成するには、SQLServer管理スタジオを開きます。 [サーバー名]テキストボックスで、[companyemployees.database.windows.net]を選択します。 SQLServer認証を使用してSQLインスタンスを接続します。これを行うには、[認証の種類]ドロップダウンボックスで[SQLServer認証]を選択します。適切なユーザー名とパスワードを入力し、[接続]をクリックします。次のスクリーンショットを参照してください。
次に、「 Cloud_HR_DB 」を作成します 」データベースで、 Ctrl + N を押します クエリエディタウィンドウを開き、次のコマンドを実行します。
CREATE DATABASE CLOUD_HR_DB GO
次の画像を参照してください。
データベースが作成されたら、次のクエリを実行して「 cEmployees 」を作成します 」Cloud_HR_DB の表 データベース。これを行うには、 HR で次のクエリを実行します データベース。
CREATE TABLE cEMPLOYEES([ID] INT IDENTITY(1、1)、[FULL_NAME] VARCHAR(500)、[PREFERRED_NAME] VARCHAR(500)、[SEARCH_NAME] NVARCHAR(MAX)、[LOGON_NAME] VARCHAR(250)、 [PHONE_NUMBER] VARCHAR(50)、[FAX_NUMBER] VARCHAR(100)、[EMAIL_ADDRESS] NVARCHAR(250))
データベースとテーブルを作成したら、クロスサーバークエリを実行するためのリンクサーバーを作成する必要があります。ローカルSQLサーバーインスタンスとAzureSQLサーバーインスタンスの間にリンクサーバーを作成するには、ローカルSQLServerインスタンスで次のコマンドを実行します。
USE [MASTER] GO EXEC MASTER.DBO.SP_ADDLINKEDSERVER @SERVER =N'AZURE_SQL_SERVER'、@ SRVPRODUCT =N''、@ PROVIDER =N'SQLNCLI'、@ DATASRC =N'COMPANYEMPLOYEES.DATABASE.WINDOWS.NET ' 、@ CATALOG =N'CLOUD_HR_DB'/ *セキュリティ上の理由により、リンクされたサーバーのリモートログインのパスワードが########で変更されます* / EXEC MASTER.DBO.SP_ADDLINKEDSRVLOGIN @ RMTSRVNAME =N'AZURE_SQL_SERVER'、@ USESELF =N 'FALSE'、@ LOCALLOGIN =NULL、@ RMTUSER =N'NISARGUPADHYAY'、@ RMTPASSWORD ='########' GO EXEC MASTER.DBO.SP_SERVEROPTION @ SERVER =N'AZURE_SQL_SERVER'、@ OPTNAME =N' DATA ACCESS'、@ OPTVALUE =N'TRUE' GO EXEC MASTER.DBO.SP_SERVEROPTION @ SERVER =N'AZURE_SQL_SERVER'、@ OPTNAME =N'RPC'、@ OPTVALUE =N'TRUE' GO EXEC MASTER.DBO.SP_SERVEROPTION @SERVER =N'AZURE_SQL_SERVER'、@ OPTNAME =N'RPC OUT'、@ OPTVALUE =N'TRUE'GO EXEC MASTER.DBO.SP_SERVEROPTION @ SERVER =N'AZURE_SQL_SERVER'、@ OPTNAME =N'CONNECT TIMEOUT'、@ OPTVALUE =N '0' GO EXEC MASTER.DBO.SP_SERVEROPTION @ SERVER =N'AZURE_SQL_SERVER'、@ OPTNAME =N'LAZY SC HEMA VALIDATION'、@ OPTVALUE =N'FALSE' GO EXEC MASTER.DBO.SP_SERVEROPTION @ SERVER =N'AZURE_SQL_SERVER'、@ OPTNAME =N'QUERY TIMEOUT'、@ OPTVALUE =N'0' GO EXEC MASTER.DBO.SP_SERVEROPTION @ SERVER =N'AZURE_SQL_SERVER'、@ OPTNAME =N'REMOTE PROC TRANSACTION PROMOTION'、@ OPTVALUE =N'TRUE'GO
リンクサーバーが作成されたら、従業員 のデータをエクスポートします cEmployees に対してSQLサーバーのローカルインスタンスで作成されたテーブル AzureSQLServerインスタンスで作成されたテーブル。これを行うには、ローカルSQLServerインスタンスで次のクエリを実行します。
INSERT INTO [AZURE_SQL_SERVER] .Cloud_HR_DB.DBO.cEMPLOYEES([FULL_NAME]、[PREFERRED_NAME]、[SEARCH_NAME]、[LOGON_NAME]、[PHONE_NUMBER]、[FAX_NUMBER]、[EMAIL_ADDRESS])SELECT FULL_NAME、PREFERRED_NAME、SEARCH_NAME、 LOGON_NAME、PHONE_NUMBER、FAX_NUMBER、EMAIL_ADDRESS FROM HR..EMPLOYEES
データがローカルインスタンスからAzureインスタンスにエクスポートされたら、次のクエリを実行して、データがコピーされたことを確認します。
SELECT * FROM [AZURE_SQL_SERVER] .Cloud_HR_DB.DBO.cEMPLOYEES
出力は次のとおりです。
リンクサーバーを使用せずにリモートサーバーにデータをコピーすることもできます。そのためには、OPENROWSETキーワードを使用する必要があります。 OPENROWSETは、OLEDBを使用してリモートデータソースに接続してアクセスするためのアドホックな方法です。 OPENROWSETの詳細については、MicrosoftのOPENROWSETのドキュメントを参照してください。
次の例では、 cEmployees からデータをコピーします Cloud_HR_DB で作成されたテーブル 従業員 に ローカルインスタンスで作成されたデータベース。 Email_Address を持つレコードのみをコピーします のように」contoso.com。 」
次に、データをコピーするために、「 ContosoEmployees 」という名前のテーブルを作成します 」の「HR 」データベース。これを行うには、次のクエリを実行します。
CREATE TABLE [DBO]。[CONTOSOEMPLOYEES]([ID] [INT] IDENTITY(1、1)NOT NULL、[FULL_NAME] [VARCHAR](500)NULL、[PREFERRED_NAME] [VARCHAR](500)NULL、 [SEARCH_NAME] [NVARCHAR](MAX)NULL、[LOGON_NAME] [VARCHAR](250)NULL、[PHONE_NUMBER] [VARCHAR](50)NULL、[FAX_NUMBER] [VARCHAR](100)NULL、[EMAIL_ADDRESS] [NVARCHAR] (250)NULL)GO
OPENROWSETを使用してデータを挿入するには、「アドホック分散クエリ 」を有効にする必要があります。 " 高度なオプション。これを行うには、次のコマンドを実行します。
EXEC SP_CONFIGURE'SHOW ADVANCED OPTIONS'、1RECONFIGURE WITH OVERRIDEEXEC SP_CONFIGURE'AD HOC DISTRIBUTED QUERIES'、1RECONFIGURE WITH OVERRIDE
次に、 cEmployees からデータをコピーします Cloud_HR_DB(Azureインスタンス) のテーブル 「ContosoEmployees へのデータベース 」の「従業員 」 」データベース(ローカルインスタンス)、ローカルサーバーで次のクエリを実行します。
USE HR GO INSERT INTO CONTOSOEMPLOYEES([FULL_NAME]、[PREFERRED_NAME]、[SEARCH_NAME]、[LOGON_NAME]、[PHONE_NUMBER]、[FAX_NUMBER]、[EMAIL_ADDRESS])SELECT * FROM OPENROWSET('SQLNCLI11'、'SERVER =COMPANYEMPLOYEES.DATABASE.WINDOWS.NET,1433; DATABASE =CLOUD_HR_DB; UID =NISARGUPADHYAY; [email protected] '、' SELECT FULL_NAME、PREFERRED_NAME、SEARCH_NAME、LOGON_NAME、PHONE_NUMBER、FAX_NUMBER、EMAIL_ADDRESS FROM CEMPLOYEES WHERE EMA COM%''')A
データがローカルインスタンスからAzureインスタンスにエクスポートされたら、次のクエリを実行して、データがコピーされたことを確認します。
SELECT FULL_NAME、PREFERRED_NAME、SEARCH_NAME、LOGON_NAME、PHONE_NUMBER、FAX_NUMBER、EMAIL_ADDRESS FROM CONTOSOEMPLOYEES
出力は次のとおりです。
この記事では、次の方法について説明しました。
異なるスキーマで作成された2つのテーブル間でデータをコピーします。
同じサーバー上の異なるデータベースで作成された2つのテーブル間でデータをコピーします。
異なるサーバーの異なるデータベースで作成された2つのテーブル間でデータをコピーします(クロスサーバークエリ)。