Database
 sql >> Database >  >> RDS >> Database

SQL avanzato:variazioni e diversi casi d'uso dell'istruzione Insert T-SQL

Nel mio precedente articolo, ho dimostrato:

  1. Inserisci l'output della funzione con valori di tabella nella tabella SQL.
  2. Inserisci l'output della funzione con valori di tabella creata sul server database remoto.

In questo articolo, dimostrerò:

  1. Copia i dati tra due tabelle, create in uno schema diverso.
  2. Copia dati tra due tabelle, create in database diversi sullo stesso server.
  3. Copia i dati tra due tabelle create, in database diversi risiede il server diverso (Query Cross server)

Trasferisci dati tra due tabelle create in uno schema diverso.

Per copiare i dati tra due tabelle create in uno schema diverso, dobbiamo utilizzare la seguente sintassi:

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

A scopo dimostrativo, utilizzerò WideWorldImportors Banca dati. Voglio copiare tutti i record da [Applicazione].[Persone] tabella al [dbo].[EmployeesWithoutLogonName] tabella con LOGONNAME uguale a "NESSUN ACCESSO ."

Innanzitutto, esaminiamo i dati di [Applicazione].[Persone] tavolo. Per farlo, esegui la seguente query:

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

Quello che segue è uno screenshot dell'output:

Ora creiamo il [dbo].[EmployeesWithoutLogonName] tavolo. Per farlo, esegui la seguente query:

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

Ora copiamo i record da [Applicazione].[Persone] a [dbo].[EmployeesWithoutLogonName] . Per farlo, esegui la seguente query:

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'

Una volta inseriti i dati, eseguire la query seguente per verificare che i dati siano stati copiati.

SELECT * 
FROM   EMPLOYEESWITHOUTLOGONNAME

Quello che segue è l'output:

Copia dati tra due tabelle, create in un database diverso

Come ho spiegato sopra, possiamo copiare i dati tra tabelle create in due schemi diversi. Allo stesso modo, possiamo copiare i dati tra due tabelle create in due database diversi. Per copiare i dati tra due database, l'utente deve disporre di "db_datareader ” per il database di origine e “db_datawriter ” nel database di destinazione.

Di seguito è riportata la sintassi:

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

Ora per dimostrare, ho creato un nuovo database chiamato "HR". Per creare un database, eseguire il comando seguente.

CREATE DATABASE HR

Ora voglio copiare i dati di EmployeesWithoutLogonName tabella, creata inWideWorldImportors database ai "Dipendenti ” creata nella HR banca dati.

Innanzitutto, creiamo una tabella denominata "Dipendenti ” nelle Risorse umane Banca dati. Per farlo, esegui la seguente query:

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

Ora per copiare i dati da "EmployeesWithoutLogonName ” alla tabella “DIPENDENTI ” tabella, eseguiamo la seguente query:

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

Una volta inseriti i dati, eseguire la query seguente per verificare che i dati siano stati copiati.

SELECT * 
FROM   HR.DBO.EMPLOYEES

Quello che segue è l'output:

Copia dati tra due tabelle, create in database diversi su server diversi

Ora, allo stesso modo, possiamo copiare i dati tra due tabelle create su due database separati creati su due server diversi. Questa operazione può essere eseguita utilizzando Server collegato o il OPENROWSET parola chiave.

Quella che segue è la sintassi per connettere il database SQL creato sul server remoto utilizzando il server collegato.

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

In questa demo, copierò i dati di Dipendente tabella creata nel database Employees al database SQL creato nel cloud di Azure. Per farlo, crea innanzitutto un database nell'istanza SQL di Azure. Ho creato un pool di risorse del server SQL denominato "companyemployees.database.windows.net.

Ora per creare un database delle risorse umane nell'istanza del database di Azure, apri SQL Server Management Studio. Nella casella di testo del nome del server, seleziona "companyemployees.database.windows.net". Useremo l'autenticazione di SQL Server per connettere l'istanza SQL. Per farlo, seleziona "Autenticazione SQL Server" nella casella a discesa del tipo di autenticazione. Fornire nome utente e password appropriati e fare clic su Connetti. Guarda lo screenshot seguente.

Ora per creare il "Cloud_HR_DB ” database, premi Ctrl+N per aprire la finestra dell'editor di query ed eseguire il comando seguente.

CREATE DATABASE CLOUD_HR_DB 
GO

Vedi l'immagine seguente.

Una volta creato il database, eseguire la query seguente per creare il "cEmployees ” sul Cloud_HR_DB Banca dati. Per farlo, esegui la seguente query in HR banca dati.

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

Una volta creati il ​​database e la tabella, è necessario creare un server collegato per eseguire una query tra server. Per creare un server collegato tra l'istanza del server SQL locale e l'istanza del server SQL di Azure, eseguire il comando seguente nell'istanza del server SQL locale.

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

Una volta creato il server collegato, consente di esportare i dati dei Dipendenti tabella, creata nell'istanza locale del server SQL per cEmployees tabella creata nell'istanza di Azure SQL Server. Per farlo, esegui la seguente query sull'istanza locale di 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

Dopo aver esportato i dati da un'istanza locale a un'istanza di Azure, esegui la query seguente per verificare che i dati siano stati copiati.

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

Quello che segue è l'output:

Possiamo anche copiare i dati su un server remoto senza utilizzare il server collegato. Per farlo, dobbiamo usare la parola chiave OPENROWSET. OPENROWSET è un metodo ad hoc per connettere e accedere all'origine dati remota utilizzando OLEDB. Per ulteriori letture di OPENROWSET, fare riferimento alla documentazione Microsoft di OPENROWSET.

Ora nell'esempio seguente copierò i dati da cEmployees tabella creata su Cloud_HR_DB ai Dipendenti database creato nell'istanza locale. Copieremo solo i record che hanno Indirizzo_email come" contoso.com.

Ora per copiare i dati, crea una tabella denominata "ContosoEmployees " in "Risorse umane " Banca dati. Per farlo, esegui la seguente query:

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

Ora per inserire i dati utilizzando OPENROWSET, dobbiamo abilitare le "Query distribuite ad hoc " opzioni avanzate. Per farlo, esegui il seguente comando.

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

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

Ora per copiare i dati dai cEmployees tabella di Cloud_HR_DB (istanza di Azure) database su "ContosoEmployees " in "Dipendenti ” database (istanza locale), eseguire la seguente query sul server locale:

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

Dopo aver esportato i dati da un'istanza locale a un'istanza di Azure, esegui la query seguente per verificare che i dati siano stati copiati.

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

Quello che segue è l'output:

In questo articolo ho spiegato come:

  1. Copia i dati tra due tabelle create in uno schema diverso.
  2. Copia dati tra due tabelle create in database diversi sullo stesso server.
  3. Copia dati tra due tabelle create in database diversi di server diversi (query cross server).