Database
 sql >> Base de Dados >  >> RDS >> Database

SQL avançado:variações e diferentes casos de uso da instrução T-SQL Insert


No meu artigo anterior, demonstrei:
  1. Insira a saída da função com valor de tabela na tabela SQL.
  2. Insira a saída da função com valor de tabela criada no servidor de banco de dados remoto.

Neste artigo, vou demonstrar:
  1. Copiar dados entre duas tabelas, criadas em um esquema diferente.
  2. Copiar dados entre duas tabelas, criadas em bancos de dados diferentes no mesmo servidor.
  3. Copiar dados entre duas tabelas criadas, em bancos de dados diferentes reside o servidor diferente (consulta entre servidores)



Transfira dados entre duas tabelas criadas em um esquema diferente.

Para copiar dados entre duas tabelas criadas em um esquema diferente, devemos usar a seguinte sintaxe:
INSERT INTO <DESTINATIONSCHEMANAME>.<DESTINATIONTABLENAME> 
            (                         COLUMN1, 
                        COLUMN2, 
                        COLUMN3                  .. 
            ) 
SELECT COLUMN1, 
       COLUMN2, 
       COLUMN3 
FROM   <SOURCESCHEMANAME>.<SOURCETABLENAME>

Para demonstração, usarei os WideWorldImporters base de dados. Desejo copiar todos os registros do [Aplicativo].[Pessoas] tabela para o [dbo].[EmployeesWithoutLogonName] tabela que tem LOGONNAME igual a ”NO LOGON .”

Primeiro, vamos analisar os dados do [Aplicativo].[Pessoas] tabela. Para isso, execute a seguinte consulta:
SELECT [PERSONID], 
       [FULLNAME], 
       [PREFERREDNAME], 
       [SEARCHNAME], 
       [LOGONNAME], 
       [PHONENUMBER], 
       [FAXNUMBER], 
       [EMAILADDRESS] 
FROM   APPLICATION.PEOPLE 
WHERE  LOGONNAME = 'NO LOGON'

A seguir, uma captura de tela da saída:



Agora, vamos criar o [dbo].[EmployeesWithoutLogonName] tabela. Para isso, execute a seguinte consulta:
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) 
  )

Agora vamos copiar registros de [Aplicativo].[Pessoas] para [dbo].[EmployeesWithoutLogonName] . Para isso, execute a seguinte consulta:
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'

Depois que os dados forem inseridos, execute a consulta a seguir para verificar se os dados foram copiados.
SELECT * 
FROM   EMPLOYEESWITHOUTLOGONNAME

Segue a saída:


Copiar dados entre duas tabelas, criadas em um banco de dados diferente


Como expliquei acima, podemos copiar dados entre tabelas criadas em dois esquemas diferentes. Da mesma forma, podemos copiar dados entre duas tabelas criadas em dois bancos de dados diferentes. Para copiar dados entre dois bancos de dados, o usuário deve ter o “db_datareader ” no banco de dados de origem e “db_datawriter ” no banco de dados de destino.

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

Agora, para demonstrar, criei um novo banco de dados chamado “HR”. Para criar um banco de dados, execute o seguinte comando.
CREATE DATABASE HR

Agora quero copiar os dados do EmployeesWithoutLogonName tabela, criada em WideWorldImporters banco de dados para os “Funcionários ” criada no HR base de dados.

Primeiro, vamos criar uma tabela chamada “Funcionários ” no RH base de dados. Para isso, execute a seguinte consulta:
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) 
  )

Agora, para copiar dados do “EmployeesWithoutLogonName ” para a tabela “FUNCIONÁRIOS ” tabela, vamos executar a seguinte consulta:
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

Depois que os dados forem inseridos, execute a consulta a seguir para verificar se os dados foram copiados.
SELECT * 
FROM   HR.DBO.EMPLOYEES

Segue a saída:


Copiar dados entre duas tabelas, criadas em diferentes bancos de dados em diferentes servidores


Agora, da mesma forma, podemos copiar dados entre duas tabelas criadas em dois bancos de dados separados criados em dois servidores diferentes. Isso pode ser feito usando Servidor vinculado ou o OPENROWSET palavra-chave.

A seguir está a sintaxe para conectar o banco de dados SQL criado no servidor remoto usando o Linked Server.
INSERT INTO <LINKEDSERVERNAME>.<DESTINATIONDATABASENAME>.<DESTINATIONSCHEMANAME>.<DESTINATIONTABLENAME> 
            ( 
                        COLUMN1, 
                        COLUMN2, 
                        COLUMN3 .. 
            ) 
SELECT COLUMN1, 
       COLUMN2, 
       COLUMN3 
FROM   <SOURCEDATABASENAME>.<SOURCESCHEMANAME>.<SOURCETABLENAME>

Nesta demonstração, vou copiar dados de Funcionário tabela criada no banco de dados Funcionários para banco de dados SQL criado na nuvem do Azure. Para fazer isso, primeiro crie um banco de dados na Instância SQL do Azure. Criei um pool de recursos do SQL Server chamado “companyemployees.database.windows.net.

Agora, para criar um banco de dados de RH na instância de banco de dados do Azure, abra o SQL Server Management Studio. Na caixa de texto do nome do servidor, selecione “companyemployees.database.windows.net”. Usaremos a autenticação do SQL Server para conectar a instância do SQL. Para fazer isso, selecione “Autenticação do SQL Server” na caixa suspensa do tipo de autenticação. Forneça o nome de usuário e a senha apropriados e clique em conectar. Veja a captura de tela a seguir.



Agora, para criar o “Cloud_HR_DB ” banco de dados, pressione Ctrl+N para abrir a janela do editor de consultas e execute o seguinte comando.
CREATE DATABASE CLOUD_HR_DB 
GO

Veja a imagem a seguir.



Depois que o banco de dados for criado, execute a seguinte consulta para criar o arquivo “cEmployees ” na tabela Cloud_HR_DB base de dados. Para fazer isso, execute a seguinte consulta no RH base de dados.
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) 
  )

Depois que o banco de dados e a tabela forem criados, precisamos criar um servidor vinculado para realizar uma consulta entre servidores. Para criar um servidor vinculado entre a instância do servidor SQL local e a instância do servidor SQL do Azure, execute o seguinte comando na instância do SQL Server 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

Depois que o servidor vinculado for criado, vamos exportar os dados dos Funcionários tabela, criada na instância local do servidor SQL para o cEmployees tabela criada na instância do Azure SQL Server. Para fazer isso, execute a seguinte consulta na instância local do 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

Depois que os dados forem exportados de uma instância local para a instância do Azure, execute a consulta a seguir para verificar se os dados foram copiados.
SELECT * 
FROM [AZURE_SQL_SERVER].Cloud_HR_DB.DBO.cEMPLOYEES

Segue a saída:



Também podemos copiar dados para um servidor remoto sem usar o Linked Server. Para fazer isso, devemos usar a palavra-chave OPENROWSET. OPENROWSET é um método ad-hoc para conectar e acessar fontes de dados remotas usando OLEDB. Para ler mais sobre OPENROWSET, consulte a documentação da Microsoft de OPENROWSET.

Agora, no exemplo a seguir, copiarei dados de cEmployees tabela criada em Cloud_HR_DB aos Funcionários banco de dados criado na instância local. Copiaremos apenas os registros que tenham Email_Address like” contoso.com.

Agora, para copiar dados, crie uma tabela chamada “ContosoEmployees ” em “RH " base de dados. Para isso, execute a seguinte consulta:
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

Agora, para inserir dados usando OPENROWSET, precisamos habilitar as “consultas distribuídas Ad Hoc " opção avançada. Para fazer isso, execute o seguinte comando.
EXEC SP_CONFIGURE 'SHOW ADVANCED OPTIONS',1
RECONFIGURE WITH OVERRIDE

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

Agora, para copiar dados dos cEmployees tabela do Cloud_HR_DB (Instância do Azure) banco de dados para “ContosoEmployees ” em “Funcionários ” banco de dados (Instância Local), execute a seguinte consulta no servidor 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

Depois que os dados forem exportados de uma instância local para a instância do Azure, execute a consulta a seguir para verificar se os dados foram copiados.
SELECT FULL_NAME, 
       PREFERRED_NAME, 
       SEARCH_NAME, 
       LOGON_NAME, 
       PHONE_NUMBER, 
       FAX_NUMBER, 
       EMAIL_ADDRESS 
FROM   CONTOSOEMPLOYEES

Segue a saída:



Neste artigo eu expliquei como:
  1. Copiar dados entre duas tabelas criadas em um esquema diferente.
  2. Copiar dados entre duas tabelas criadas em bancos de dados diferentes no mesmo servidor.
  3. Copiar dados entre duas tabelas criadas em bancos de dados diferentes do servidor diferente (consulta entre servidores).