Database
 sql >> Base de données >  >> RDS >> Database

SQL avancé :variations et différents cas d'utilisation de l'instruction d'insertion T-SQL

Dans mon article précédent, j'ai démontré :

  1. Insérez la sortie de la fonction table dans la table SQL.
  2. Insérez la sortie de la fonction table qui est créée sur le serveur de base de données distant.

Dans cet article, je vais démontrer :

  1. Copier des données entre deux tables, créées dans un schéma différent.
  2. Copier des données entre deux tables, créées dans différentes bases de données sur le même serveur.
  3. Copier les données entre deux tables créées, dans différentes bases de données résident les différents serveurs (requête inter-serveurs)

Transférer des données entre deux tables créées dans un schéma différent.

Pour copier des données entre deux tables créées dans un schéma différent, nous devons utiliser la syntaxe suivante :

INSERT INTO <DESTINATIONSCHEMANAME>.<DESTINATIONTABLENAME> 
            (                         COLUMN1, 
                        COLUMN2, 
                        COLUMN3                  .. 
            ) 
SELECT COLUMN1, 
       COLUMN2, 
       COLUMN3 
FROM   <SOURCESCHEMANAME>.<SOURCETABLENAME>

Pour la démonstration, je vais utiliser les WideWorldImportors base de données. Je souhaite copier tous les enregistrements de [Application].[Personnes] table à [dbo].[EmployeesWithoutLogonName] table dont LOGONNAME est égal à "NO LOGON ."

Tout d'abord, examinons les données de [Application].[People] table. Pour cela, exécutez la requête suivante :

SELECT [PERSONID], 
       [FULLNAME], 
       [PREFERREDNAME], 
       [SEARCHNAME], 
       [LOGONNAME], 
       [PHONENUMBER], 
       [FAXNUMBER], 
       [EMAILADDRESS] 
FROM   APPLICATION.PEOPLE 
WHERE  LOGONNAME = 'NO LOGON'

Voici une capture d'écran de la sortie :

Maintenant, créons le [dbo].[EmployeesWithoutLogonName] table. Pour cela, exécutez la requête suivante :

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) 
  )

Maintenant, copions les enregistrements de [Application].[Personnes] à [dbo].[EmployésSansNomLogon] . Pour cela, exécutez la requête suivante :

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'

Une fois les données insérées, exécutez la requête suivante pour vérifier que les données ont été copiées.

SELECT * 
FROM   EMPLOYEESWITHOUTLOGONNAME

Voici le résultat :

Copier des données entre deux tables, créées dans une base de données différente

Comme je l'ai expliqué ci-dessus, nous pouvons copier des données entre des tables créées dans deux schémas différents. De même, nous pouvons copier des données entre deux tables créées dans deux bases de données différentes. Pour copier des données entre deux bases de données, l'utilisateur doit disposer du "db_datareader ” sur la base de données source et “db_datawriter ” sur la base de données de destination.

Voici la syntaxe :

INSERT INTO <DESTINATIONDATABASENAME>.<DESTINATIONSCHEMANAME>.<DESTINATIONTABLENAME> 
            ( 
                        COLUMN1, 
                        COLUMN2, 
                        COLUMN3 .. 
            ) 
SELECT COLUMN1, 
       COLUMN2, 
       COLUMN3 
FROM   <SOURCEDATABASENAME>.<SOURCESCHEMANAME>.<SOURCETABLENAME>

Maintenant, pour démontrer, j'ai créé une nouvelle base de données nommée "RH". Pour créer une base de données, exécutez la commande suivante.

CREATE DATABASE HR

Maintenant, je veux copier les données de EmployeesWithoutLogonName table, créée dans WideWorldImportors base de données aux "Employés ” tableau créé dans le RH base de données.

Commençons par créer une table nommée "Employés ” dans les RH base de données. Pour cela, exécutez la requête suivante :

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) 
  )

Maintenant, pour copier les données de "EmployeesWithoutLogonName » au tableau « EMPLOYÉS ” table, exécutons la requête suivante :

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

Une fois les données insérées, exécutez la requête suivante pour vérifier que les données ont été copiées.

SELECT * 
FROM   HR.DBO.EMPLOYEES

Voici le résultat :

Copier des données entre deux tables, créées dans différentes bases de données sur différents serveurs

Maintenant, de la même manière, nous pouvons copier des données entre deux tables créées sur deux bases de données distinctes créées sur deux serveurs différents. Cela peut être effectué à l'aide du serveur lié ou le OPENROWSET mot-clé.

Voici la syntaxe pour connecter la base de données SQL créée sur le serveur distant à l'aide du serveur lié.

INSERT INTO <LINKEDSERVERNAME>.<DESTINATIONDATABASENAME>.<DESTINATIONSCHEMANAME>.<DESTINATIONTABLENAME> 
            ( 
                        COLUMN1, 
                        COLUMN2, 
                        COLUMN3 .. 
            ) 
SELECT COLUMN1, 
       COLUMN2, 
       COLUMN3 
FROM   <SOURCEDATABASENAME>.<SOURCESCHEMANAME>.<SOURCETABLENAME>

Dans cette démo, je vais copier les données de Employé table créée sur la base de données Employés vers la base de données SQL créée sur le cloud Azure. Pour ce faire, créez d'abord une base de données sur Azure SQL Instance. J'ai créé un pool de ressources de serveur SQL nommé "companyemployees.database.windows.net.

Maintenant, pour créer une base de données RH sur une instance de base de données Azure, ouvrez SQL Server Management Studio. Dans la zone de texte du nom du serveur, sélectionnez "companyemployees.database.windows.net". Nous utiliserons l'authentification SQL Server pour connecter l'instance SQL. Pour ce faire, sélectionnez « Authentification SQL Server » dans la liste déroulante des types d'authentification. Indiquez le nom d'utilisateur et le mot de passe appropriés et cliquez sur se connecter. Voir la capture d'écran suivante.

Maintenant, pour créer le "Cloud_HR_DB ” base de données, Appuyez sur Ctrl+N pour ouvrir la fenêtre de l'éditeur de requête et exécuter la commande suivante.

CREATE DATABASE CLOUD_HR_DB 
GO

Voir l'image suivante.

Une fois la base de données créée, exécutez la requête suivante pour créer le "cEmployees ” table sur le Cloud_HR_DB base de données. Pour ce faire, exécutez la requête suivante dans le HR base de données.

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) 
  )

Une fois la base de données et la table créées, nous devons créer un serveur lié pour effectuer une requête inter-serveurs. Pour créer un serveur lié entre l'instance du serveur SQL local et l'instance du serveur SQL Azure, exécutez la commande suivante sur l'instance du serveur SQL local.

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' 

/* FOR SECURITY REASONS THE LINKED SERVER REMOTE LOGINS PASSWORD IS CHANGED WITH ######## */ 
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 SCHEMA 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

Une fois le serveur lié créé, permet d'exporter les données des Employés table, créée sur l'instance locale du serveur SQL pour le cEmployees table créée sur l'instance Azure SQL Server. Pour ce faire, exécutez la requête suivante sur l'instance locale de SQL Server :

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

Une fois les données exportées d'une instance locale vers Azure Instance, exécutez la requête suivante pour vérifier que les données ont été copiées.

SELECT * 
FROM [AZURE_SQL_SERVER].Cloud_HR_DB.DBO.cEMPLOYEES

Voici le résultat :

Nous pouvons également copier des données sur un serveur distant sans utiliser Linked Server. Pour ce faire, nous devons utiliser le mot-clé OPENROWSET. OPENROWSET est une méthode ad hoc pour se connecter et accéder à une source de données distante à l'aide d'OLEDB. Pour en savoir plus sur OPENROWSET, reportez-vous à la documentation Microsoft d'OPENROWSET.

Maintenant, dans l'exemple suivant, je vais copier les données de cEmployees table créée sur Cloud_HR_DB aux Employés base de données créée sur l'instance locale. Nous ne copierons que les enregistrements qui ont Email_Address comme " contoso.com.

Maintenant, pour copier les données, créez une table nommée "ContosoEmployees " dans le "RH " base de données. Pour cela, exécutez la requête suivante :

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

Maintenant, pour insérer des données à l'aide d'OPENROWSET, nous devons activer les "requêtes distribuées ad hoc ” option avancée. Pour ce faire, exécutez la commande suivante.

EXEC SP_CONFIGURE 'SHOW ADVANCED OPTIONS',1
RECONFIGURE WITH OVERRIDE

EXEC SP_CONFIGURE 'AD HOC DISTRIBUTED QUERIES',1
RECONFIGURE WITH OVERRIDE

Maintenant, pour copier les données du cEmployés table de Cloud_HR_DB (instance Azure) base de données à "ContosoEmployees  » dans la section « Employés ” database (Local Instance), exécutez la requête suivante sur le serveur local :

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  EMAIL_ADDRESS LIKE ''%CONTOSO.COM%''')A

Une fois les données exportées d'une instance locale vers Azure Instance, exécutez la requête suivante pour vérifier que les données ont été copiées.

SELECT FULL_NAME, 
       PREFERRED_NAME, 
       SEARCH_NAME, 
       LOGON_NAME, 
       PHONE_NUMBER, 
       FAX_NUMBER, 
       EMAIL_ADDRESS 
FROM   CONTOSOEMPLOYEES

Voici le résultat :

Dans cet article, j'ai expliqué comment :

  1. Copier des données entre deux tables créées dans un schéma différent.
  2. Copier des données entre deux tables créées dans différentes bases de données sur le même serveur.
  3. Copier des données entre deux tables créées dans différentes bases de données de différents serveurs (requête inter-serveurs).