sql >> Base de Datos >  >> RDS >> Database

SQL avanzado:variaciones y diferentes casos de uso de la declaración de inserción de T-SQL

En mi artículo anterior, demostré:

  1. Inserte la salida de la función con valores de tabla en la tabla SQL.
  2. Inserte la salida de la función con valores de tabla que se crea en el servidor de la base de datos remota.

En este artículo, voy a demostrar:

  1. Copia datos entre dos tablas, creadas en un esquema diferente.
  2. Copia datos entre dos tablas, creadas en diferentes bases de datos en el mismo servidor.
  3. Copiar datos entre dos tablas creadas, en diferentes bases de datos reside el servidor diferente (consulta entre servidores)

Transferir datos entre dos tablas creadas en un esquema diferente.

Para copiar datos entre dos tablas creadas en un esquema diferente, debemos usar la siguiente sintaxis:

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

Para la demostración, voy a utilizar WideWorldImportors base de datos. Quiero copiar todos los registros de la [Aplicación].[Personas] tabla al [dbo].[EmployeesWithoutLogonName] tabla que tiene LOGONNAME igual a ”NO LOGON .”

Primero, revisemos los datos de la [Aplicación].[Personas] mesa. Para hacer eso, ejecute la siguiente consulta:

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

La siguiente es una captura de pantalla de la salida:

Ahora, creemos el [dbo].[EmployeesWithoutLogonName] mesa. Para hacer eso, ejecute la siguiente 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) 
  )

Ahora copiemos registros de [Aplicación].[Personas] a [dbo].[EmployeesWithoutLogonName] . Para hacer eso, ejecute la siguiente 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'

Una vez insertados los datos, ejecute la siguiente consulta para verificar que los datos se hayan copiado.

SELECT * 
FROM   EMPLOYEESWITHOUTLOGONNAME

El siguiente es el resultado:

Copiar datos entre dos tablas, creadas en una base de datos diferente

Como expliqué anteriormente, podemos copiar datos entre tablas creadas en dos esquemas diferentes. Del mismo modo, podemos copiar datos entre dos tablas creadas en dos bases de datos diferentes. Para copiar datos entre dos bases de datos, el usuario debe tener el “db_datareader ” en la base de datos de origen y “db_datawriter ” en la base de datos de destino.

La siguiente es la sintaxis:

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

Ahora, para demostrarlo, he creado una nueva base de datos llamada "HR". Para crear una base de datos, ejecute el siguiente comando.

CREATE DATABASE HR

Ahora quiero copiar los datos de EmployeesWithoutLogonName tabla, creada en WideWorldImportors base de datos a los “Empleados ” tabla creada en el HR base de datos.

Primero, creemos una tabla llamada "Empleados ” en el RRHH base de datos. Para hacer eso, ejecute la siguiente 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) 
  )

Ahora, para copiar datos de "EmployeesWithoutLogonName ” a la tabla “EMPLEADOS ”, ejecutemos la siguiente 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

Una vez insertados los datos, ejecute la siguiente consulta para verificar que los datos se hayan copiado.

SELECT * 
FROM   HR.DBO.EMPLOYEES

El siguiente es el resultado:

Copiar datos entre dos tablas, creadas en las diferentes bases de datos en diferentes servidores

Ahora, de manera similar, podemos copiar datos entre dos tablas creadas en dos bases de datos separadas creadas en dos servidores diferentes. Esto se puede realizar utilizando servidor vinculado o el OPENROWSET palabra clave.

La siguiente es la sintaxis para conectar la base de datos SQL creada en el servidor remoto utilizando el servidor vinculado.

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

En esta demostración, voy a copiar datos de Empleado tabla creada en la base de datos de empleados a la base de datos SQL creada en la nube de Azure. Para hacerlo, primero cree una base de datos en Azure SQL Instance. Creé un grupo de recursos del servidor SQL llamado "companyemployees.database.windows.net.

Ahora, para crear una base de datos de recursos humanos en la instancia de la base de datos de Azure, abra el estudio de administración de SQL Server. En el cuadro de texto del nombre del servidor, seleccione "companyemployees.database.windows.net". Usaremos la autenticación de SQL Server para conectar la instancia de SQL. Para hacer eso, seleccione "Autenticación de SQL Server" en el cuadro desplegable de tipo de autenticación. Proporcione el nombre de usuario y la contraseña apropiados y haga clic en conectar. Vea la siguiente captura de pantalla.

Ahora para crear el "Cloud_HR_DB ” base de datos, presione Ctrl+N para abrir la ventana del editor de consultas y ejecutar el siguiente comando.

CREATE DATABASE CLOUD_HR_DB 
GO

Ver la siguiente imagen.

Una vez creada la base de datos, ejecute la siguiente consulta para crear los “cEmpleados ” en la tabla Cloud_HR_DB base de datos. Para hacer eso, ejecute la siguiente consulta en el HR base de datos.

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 vez que se crean la base de datos y la tabla, necesitamos crear un servidor vinculado para realizar una consulta entre servidores. Para crear un servidor vinculado entre la instancia del servidor SQL local y la instancia del servidor SQL Azure, ejecute el siguiente comando en la instancia del servidor 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

Una vez que se crea el servidor vinculado, permite exportar los datos de los Empleados tabla, creada en la instancia local del servidor SQL para cEmployees tabla creada en la instancia de Azure SQL Server. Para hacer eso, ejecute la siguiente consulta en la instancia local 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

Una vez que los datos se exportan desde una instancia local a la instancia de Azure, ejecute la siguiente consulta para verificar que los datos se hayan copiado.

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

El siguiente es el resultado:

También podemos copiar datos a un servidor remoto sin usar Linked Server. Para hacer eso, debemos usar la palabra clave OPENROWSET. OPENROWSET es un método ad-hoc para conectarse y acceder a una fuente de datos remota mediante OLEDB. Para obtener más información sobre OPENROWSET, consulte la documentación de Microsoft de OPENROWSET.

Ahora, en el siguiente ejemplo, copiaré datos de cEmployees tabla creada en Cloud_HR_DB a los Empleados base de datos creada en la instancia local. Copiaremos solo aquellos registros que tengan Email_Address como” contoso.com.

Ahora, para copiar datos, cree una tabla denominada "ContosoEmployees ” en el “RRHH ” base de datos. Para hacer eso, ejecute la siguiente 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

Ahora, para insertar datos usando OPENROWSET, debemos habilitar las "consultas distribuidas Ad Hoc " opción avanzada. Para hacer eso, ejecute el siguiente comando.

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

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

Ahora para copiar datos de los cEmpleados tabla de la Cloud_HR_DB (Instancia de Azure) base de datos a “ContosoEmployees ” en la sección “Empleados ” base de datos (Instancia local), ejecute la siguiente consulta en el 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

Una vez que los datos se exportan desde una instancia local a la instancia de Azure, ejecute la siguiente consulta para verificar que los datos se hayan copiado.

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

El siguiente es el resultado:

En este artículo he explicado cómo:

  1. Copiar datos entre dos tablas creadas en un esquema diferente.
  2. Copia datos entre dos tablas creadas en diferentes bases de datos en el mismo servidor.
  3. Copiar datos entre dos tablas creadas en diferentes bases de datos de diferentes servidores (consulta entre servidores).