sql >> データベース >  >> RDS >> Database

高度なSQL:T-SQL挿入ステートメントのバリエーションとさまざまなユースケース

    前回の記事で、次のことを示しました。

    1. テーブル値関数の出力をSQLテーブルに挿入します。
    2. リモートデータベースサーバーで作成されたテーブル値関数の出力を挿入します。

    この記事では、次のことを説明します。

    1. 異なるスキーマで作成された2つのテーブル間でデータをコピーします。
    2. 同じサーバー上の異なるデータベースで作成された2つのテーブル間でデータをコピーします。
    3. 異なるデータベースに作成された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 

    出力は次のとおりです。

    この記事では、次の方法について説明しました。

    1. 異なるスキーマで作成された2つのテーブル間でデータをコピーします。
    2. 同じサーバー上の異なるデータベースで作成された2つのテーブル間でデータをコピーします。
    3. 異なるサーバーの異なるデータベースで作成された2つのテーブル間でデータをコピーします(クロスサーバークエリ)。

    1. OracleDatabaseClientを段階的にインストールする

    2. MySQLの単一引用符、二重引用符、逆引用符の使用法の説明

    3. SQLServerに対するVMwareCPUホットプラグvNUMAの影響

    4. SET DATEFIRST –SQLServerで週の最初の曜日を設定します