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

SQL avanzado:inserte la salida de la función con valores de tabla parametrizada en la tabla SQL

En este artículo, voy a demostrar lo siguiente:

  1. Cómo insertar la salida de una función con valores de tabla en una tabla SQL.
  2. Cómo insertar la salida de una función con valores de tabla que se crea en el servidor de base de datos remoto.

¿Qué es la declaración "Insertar en"

En RDBMS, "Insertar en" es una de las declaraciones básicas de SQL. Se utiliza para insertar nuevos registros en una tabla SQL. Usando la declaración, podemos realizar las siguientes tareas:

  • Insertar nuevos registros en una tabla (inserción básica).
  • Insertar valores de una columna específica en una tabla.
  • Inserte la salida generada por un procedimiento almacenado en una tabla SQL.

Para demostrar lo anterior, creemos una tabla llamada "Estudiantes ” en DemoDatabase. Ejecute el siguiente código para crear la tabla:

CREATE TABLE STUDENTS 
  ( 
     ID        	INT IDENTITY(1, 1) PRIMARY KEY, 
     FIRSTNAME 	VARCHAR(250), 
     LASTNAME  	VARCHAR(250), 
     ADMISSIONDATE  DATETIME,
     GRADE     	CHAR(1) 
  )

Realizar inserción básica

Para realizar una inserción básica, debemos proporcionar el nombre de la tabla de destino y los valores de la tabla. La siguiente es una sintaxis básica de la declaración de inserción básica:

INSERT INTO <target TABLE NAME> VALUES 
            ( 
                        <value FOR COLUMN 1 >, 
                        <value FOR COLUMN 1 >.. 
            )

Por ejemplo, queremos insertar el nombre, el apellido y el grado de tres estudiantes en la tabla "Estudiantes". Para hacer eso, ejecute el siguiente código:

INSERT INTO STUDENTS 
VALUES      ('NISARG', 
             'UPADHYAY', 
             '2018-09-11', 
             'A'), 
            ('RAGHAV', 
             'DATTA', 
             '2017-10-01', 
             'A'), 
            ('KIRAN', 
             'AMIN', 
             '2016-01-31', 
             'A')

Ejecute la consulta "Seleccionar" contra "Estudiante" para revisar los resultados.

SELECT FIRSTNAME, 
       LASTNAME, 
       ADMISSIONDATE, 
       GRADE 
FROM   STUDENTS

El resultado es el siguiente:

Insertar valores de una columna específica en la tabla

Para insertar valores en columnas específicas de una tabla, debe proporcionar el nombre de la tabla de destino y el nombre de las columnas en las que desea insertar datos. La siguiente es la sintaxis.

INSERT INTO <TARGET TABLE NAME> 
            ( 
                        COLUMN 1 , 
                        COLUMN 2 
            ) 
            VALUES 
            ( 
                        <VALUE FOR COLUMN 1 >, 
                        <VALUE FOR COLUMN 1 >.. 
            )

Por ejemplo, queremos insertar el nombre y apellido de dos estudiantes en el campo “Estudiantes " mesa. Para hacer eso, ejecute el siguiente código:

INSERT INTO STUDENTS 
            (FIRSTNAME, 
             LASTNAME) 
VALUES      ('NIMESH', 
             'UPADHYAY'), 
            ('RUPESH', 
             'DATTA')

Ejecute la consulta "Seleccionar" contra los "Estudiantes ” mesa.

SELECT FIRSTNAME, 
       LASTNAME, 
       ADMISSIONDATE, 
       GRADE 
FROM   STUDENTS

El resultado es el siguiente:

Insertar la salida, generar mediante un procedimiento almacenado

Para insertar la salida de un procedimiento almacenado en la tabla, debemos especificar el nombre de la tabla de destino y el procedimiento almacenado de origen. Para generar la salida del procedimiento almacenado, necesitamos usar la palabra clave "exec" o "EXECUTE". Por lo tanto, debemos proporcionar el nombre de la tabla o los nombres de las columnas seguidos de la palabra clave "exec". La siguiente es la sintaxis:

INSERT INTO <TARGET TABLE NAME> 
            ( 
                        COLUMN 1 , 
                        COLUMN 2 
            ) 
EXEC <PROCEDURENAME>

Por ejemplo, queremos insertar la salida del procedimiento que completa los nombres de los estudiantes cuya fecha de admisión no es nula. Para hacer eso, crearemos un procedimiento almacenado llamado “spGet_Student_AdmissionDate ”. Para crear un procedimiento almacenado, ejecute el siguiente código:

USE DEMODATABASE 

GO 

CREATE PROCEDURE SPGET_STUDENT_ADMISSIONDATE 
AS 
  BEGIN 
      SELECT ISNULL(FIRSTNAME, '') + ' ' 
             + ISNULL(LASTNAME, '') AS STUDENTNAME, 
             ADMISSIONDATE, 
             GRADE 
      FROM   STUDENTS 
      WHERE  ADMISSIONDATE IS NOT NULL 
  END

Una vez creado el procedimiento, ejecútelo ejecutando el siguiente código:

EXECUTE spGet_Student_Admissiondate

El resultado es el siguiente:

Como mencioné anteriormente, queremos insertar la salida del procedimiento almacenado llamado "spGet_Student_Admissiondate ” en una tabla temporal. En primer lugar, ejecute el siguiente código para crear la tabla:

  ( 
     ID            INT IDENTITY(1, 1), 
     STUDENTNAME   VARCHAR(250), 
     ADMISSIONDATE DATETIME, 
     GRADE         CHAR(1) 
  )

Una vez creada la tabla, ejecute el siguiente código para insertar el resultado de “spGet_Student_Admissiondate ” a “#TempStudents ”.

INSERT INTO #TEMPSTUDENTS 
EXECUTE SPGET_STUDENT_ADMISSIONDATE 
Output: (3 rows affected)

Ahora veamos el resultado de "#TEMPSTUDENTS ”. Para hacer eso, ejecute el siguiente código:

Ahora, como mencioné anteriormente, voy a demostrar cómo podemos insertar una salida generada por una función con valores de tabla en una tabla SQL. En primer lugar, comprendamos qué es una función con valores de tabla.

¿Qué es la función con valores de tabla?

Una función con valores de tabla es un código T-SQL especial que acepta parámetro/parámetros y, según las condiciones definidas en una variable, devuelve el conjunto de resultados en la variable de tabla. Los siguientes son los beneficios de usar la función con valores de tabla:

  1. Se puede ejecutar dentro de la consulta Seleccionar.
  2. Se puede usar en varias partes de una consulta, por ejemplo, en la instrucción Case, cláusulas where/have.
  3. La salida de una función con valores de tabla es un conjunto de registros, por lo que puede unir la función con tablas.

Insertar salida de la función con valores de tabla en línea en la tabla SQL

En esta sección, voy a explicar cómo insertar la salida de una función con valores de tabla en una tabla SQL usando T-SQL.

Para demostración, estoy usando la base de datos AdventureWorks2014. Creé una función de tabla de valores múltiples en línea llamada "GetEmployeesbyHireDate .” Esta función completa la información de los empleados contratados en una fecha y hora específicas. La función utiliza @FormDate y @Toda los parámetros para filtrar los datos. La salida de la función se almacenará en una tabla SQL.

El siguiente código crea una función:

CREATE FUNCTION GETEMPLOYEESBYHIREDATE (@FROMDATE AS DATETIME, 
                                        @TODATE   AS DATETIME) 
RETURNS @EMPLOYEES TABLE ( 
  EMPLOYEENAME VARCHAR (MAX), 
  BIRTHDATE    DATETIME, 
  JOBTITLE     VARCHAR(150), 
  EMAILID      VARCHAR(100), 
  PHONENUMBER  VARCHAR(20), 
  HIREDATE     DATETIME ) 
AS 
  BEGIN 
      INSERT INTO @EMPLOYEES 
      SELECT ( ISNULL( B.FIRSTNAME, '') + ' ' 
               + ISNULL( B.MIDDLENAME, '') + ' ' 
               + ISNULL( B.LASTNAME, '') )AS EMPLOYEENAME, 
             A.BIRTHDATE, 
             B.JOBTITLE, 
             B.EMAILADDRESS, 
             B.PHONENUMBER, 
             A.HIREDATE 
      FROM   [HUMANRESOURCES].[EMPLOYEE] A 
             INNER JOIN [HUMANRESOURCES].[VEMPLOYEE] B 
                     ON A.BUSINESSENTITYID = B.BUSINESSENTITYID 
      WHERE  A.HIREDATE BETWEEN @FROMDATE AND @TODATE 

      RETURN 
  END

Usando la consulta Select, podemos obtener el resultado de una función SQL. Por ejemplo, desea completar una lista de empleados contratados en el año 2009. Ejecute la siguiente consulta para obtener la lista:

DECLARE @FROMDT DATETIME 
DECLARE @TODT DATETIME 

SET @FROMDT='2009-01-01' 
SET @TODT='2009-12-31' 

SELECT * 
FROM   GETEMPLOYEESBYHIREDATE(@FROMDT, @TODT)

El resultado de la consulta anterior tiene el siguiente aspecto:

Ahora, crea una tabla llamada “tblEmploye e” para almacenar la salida de “GetEmployeesbyHiredate " función. El siguiente código crea la tabla denominada “tblEmployee ”.

CREATE TABLE TBLEMPLOYEES 
  ( 
     EMPLOYEENAME VARCHAR (MAX), 
     BIRTHDATE    DATETIME, 
     JOBTITLE     VARCHAR(150), 
     EMAILID      VARCHAR(100), 
     PHONENUMBER  VARCHAR(20), 
     HIREDATE     DATETIME 
  )

Como mencioné anteriormente, queremos completar la información de los empleados que fueron contratados en 2009. Para hacerlo, inserte el resultado de GetEmployeesbyHireDate función en el tblEmployees mesa. Para hacer eso, ejecute el siguiente código:

DECLARE @FROMDT DATETIME 
DECLARE @TODT DATETIME 

SET @FROMDT='2009-01-01' 
SET @TODT='2009-12-31' 

INSERT INTO TBLEMPLOYEES 
SELECT EMPLOYEENAME, 
       BIRTHDATE, 
       JOBTITLE, 
       EMAILID, 
       PHONENUMBER, 
       HIREDATE 
FROM   GETEMPLOYEESBYHIREDATE(@FROMDT, @TODT)

Verifiquemos que se hayan insertado datos en la tabla. Para hacer eso, ejecute el siguiente código:

SELECT * 
FROM   TBLEMPLOYEES

El resultado es el siguiente:

Insertar datos en tablas desde bases de datos remotas

A veces, es posible que desee extraer datos de los servidores almacenados en un centro de datos diferente. Esto se puede hacer usando un servidor vinculado a SQL.

En esta sección, explicaré cómo insertar la salida de la función de valores de tabla, creada en el servidor remoto. Ahora, para demostrar el escenario, la siguiente es la configuración.

[identificación de la tabla=57 /]

En la demostración, realizaremos las siguientes tareas:

  1. En el servidor de origen (SQL_VM_1 ), cree una función con valores de tabla llamada "getCustomerByCountry ” en el “AdventureWorks2014 ” base de datos para completar los datos.
  2. En el servidor de destino, cree un servidor vinculado llamado "Servidor_remoto ” para ejecutar la función (getCustomerByCountry ).
  3. En el servidor de destino, cree una tabla denominada "Cliente ” para almacenar datos, recuperados por la función remota (getCustomerByCountry ).

La siguiente imagen ilustra la configuración.

La tarea a realizar en un servidor de origen:

En el servidor de origen (SQL_VM_1 ), cree una función llamada “getCustomerByCountry .” Rellena los detalles de un cliente ubicado en un país o región específicos. La función utiliza @CountryName parámetro para filtrar los datos. Ejecute el siguiente código para crear la función.

Alter FUNCTION Getcustomerbycountry(@CountryName VARCHAR)
returns @Customers TABLE (
  customer_name VARCHAR(500),
  phoennumber   VARCHAR(50),
  emailaddress  VARCHAR(100),
  address       VARCHAR(max),
  city          VARCHAR(150),
  country       VARCHAR(250),
  postalcode    VARCHAR(50))
AS
  BEGIN
      INSERT INTO @Customers
      SELECT customer_name,
             phoennumber,
             emailaddress,
             address,
             city,
             country,
             postalcode
      FROM   customers
      WHERE  country [email protected]

      RETURN
  END

Las tareas a realizar en el servidor de destino:

Para completar los datos del servidor de origen (SQL_VM_1 ), primero, cree un servidor vinculado entre la fuente (SQL_VM_1 ) y destino (SQL_VM_ 2). Ejecute el siguiente código en el servidor de destino (SQL_VM_2 ) para crear un servidor vinculado.

USE [MASTER]
GO
EXEC MASTER.DBO.SP_ADDLINKEDSERVER @SERVER = N'SQL_VM_1', @SRVPRODUCT=N'SQL SERVER'
GO
EXEC MASTER.DBO.SP_ADDLINKEDSRVLOGIN @RMTSRVNAME=N' Remote_Server',@USESELF=N'FALSE',@LOCALLOGIN=NULL,@RMTUSER=N'SA',@RMTPASSWORD='########'
GO
EXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'Remote_Server', @OPTNAME=N'COLLATION COMPATIBLE', @OPTVALUE=N'TRUE'
GO
EXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'Remote_Server', @OPTNAME=N'DATA ACCESS', @OPTVALUE=N'TRUE'
GO
EXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'Remote_Server', @OPTNAME=N'DIST', @OPTVALUE=N'FALSE'
GO
EXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'Remote_Server', @OPTNAME=N'PUB', @OPTVALUE=N'FALSE'
GO
EXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'Remote_Server', @OPTNAME=N'RPC', @OPTVALUE=N'TRUE'
GO
EXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'Remote_Server', @OPTNAME=N'RPC OUT', @OPTVALUE=N'TRUE'
GO
EXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'Remote_Server', @OPTNAME=N'SUB', @OPTVALUE=N'FALSE'
GO
EXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'Remote_Server', @OPTNAME=N'CONNECT TIMEOUT', @OPTVALUE=N'0'
GO
EXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'Remote_Server', @OPTNAME=N'COLLATION NAME', @OPTVALUE=NULL
GO
EXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'Remote_Server', @OPTNAME=N'LAZY SCHEMA VALIDATION', @OPTVALUE=N'FALSE'
GO
EXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'Remote_Server', @OPTNAME=N'QUERY TIMEOUT', @OPTVALUE=N'0'
GO
EXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'Remote_Server', @OPTNAME=N'USE REMOTE COLLATION', @OPTVALUE=N'TRUE'
GO
EXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'Remote_Server', @OPTNAME=N'REMOTE PROC TRANSACTION PROMOTION', @OPTVALUE=N'FALSE'
GO

Una vez que se crea el servidor vinculado, cree una tabla SQL para almacenar la información de los clientes y complétela ejecutando la función SQL, creada en el servidor de origen (SQL_VM_1 ).

Ejecute el siguiente código para crear una tabla.

USE DEMODATABASE
GO
CREATE TABLE CUSTOMERS
  (
     ID            INT IDENTITY(1, 1),
     CUSTOMER_NAME VARCHAR(500),
     PHONENUMBER   VARCHAR(50),
     EMAILADDRESS VARCHAR(100),
     ADDRESS       VARCHAR(MAX),
     CITY          VARCHAR(150),
     COUNTRY       VARCHAR(250),
     POSTALCODE    VARCHAR(50)
  )

Usando un servidor vinculado, podemos ejecutar la función con valores de tabla creada en un servidor de base de datos remoto. Cuando intenta ejecutar la función utilizando el servidor vinculado, se produce el siguiente error:

Msg 4122, Level 16, State 1, Line 28
Remote table-valued function calls are not allowed.

Por lo tanto, para ejecutar cualquier función en el servidor remoto, necesitamos usar la palabra clave OPENQUERY. Se utiliza para inicializar la consulta distribuida ad hoc utilizando un servidor vinculado. Consulte este artículo para comprender el concepto de OPENQUERY.

Para usar OPENQUERY, debemos habilitar el parámetro de configuración avanzada llamado "Consultas distribuidas ad hoc ” en los servidores de origen y destino. Ejecute el siguiente código para habilitarlo.

USE MASTER
GO
EXEC SP_CONFIGURE 'SHOW ADVANCED OPTION', 1
RECONFIGURE WITH OVERRIDE
EXEC SP_CONFIGURE 'AD HOC DISTRIBUTED QUERIES', 1
RECONFIGURE WITH OVERRIDE

Ahora quiero completar la lista de clientes, ubicados en el Reino Unido e insertarlos en "Clientes " mesa. Como mencioné, la función acepta el nombre del país para filtrar los registros. Ahora, debemos ejecutar el siguiente script en el servidor de destino (SQL_VM_2 ) para completar la lista de clientes ubicados en "Reino Unido".

SELECT CUSTOMER_NAME, 
       PHOENNUMBER, 
       EMAILADDRESS, 
       ADDRESS, 
       CITY, 
       COUNTRY, 
       POSTALCODE 
FROM   OPENQUERY([TTI609-VM2], 
'DECLARE @COUNTRY VARCHAR(150)
SET @COUNTRY=''UNITED KINGDOM''    
SELECT * FROM [ADVENTUREWORKS2014].DBO.GETCUSTOMERBYCOUNTRY(''''+ @COUNTRY +'''')' 
)

El resultado es el siguiente:

Ahora, para insertar datos poblados por en la tabla "Clientes", ejecute el siguiente script en el servidor de destino (SQL_VM_2 ).

INSERT INTO CUSTOMERS (CUSTOMER_NAME,PHONENUMBER,EMAILADDRESS,ADDRESS,CITY,COUNTRY,POSTALCODE)
SELECT CUSTOMER_NAME, 
       PHOENNUMBER, 
       EMAILADDRESS, 
       ADDRESS, 
       CITY, 
       COUNTRY, 
       POSTALCODE 
FROM   OPENQUERY([TTI609-VM2], 
'DECLARE @COUNTRY VARCHAR(150)
SET @COUNTRY=''UNITED KINGDOM''    
SELECT * FROM [ADVENTUREWORKS2014].DBO.GETCUSTOMERBYCOUNTRY(''''+ @COUNTRY +'''')' 
)

/*Output*/

(1913 rows affected)

Ahora verifiquemos si los datos se han insertado correctamente. Para verificar, ejecute la siguiente consulta en el servidor de destino (SQL_VM_2).

USE DEMODATABASE
GO
SELECT TOP 20 CUSTOMER_NAME, 
       PHONENUMBER, 
       EMAILADDRESS, 
       ADDRESS, 
       CITY, 
       COUNTRY, 
       POSTALCODE 
FROM   CUSTOMERS

El resultado es el siguiente:

Resumen

En este artículo he cubierto:

  1. Declaración "Insertar en" y su uso.
  2. Cómo guardar la salida de la función con valores de tabla en una tabla SQL.
  3. Cómo guardar el resultado de la función con valores de tabla en la tabla SQL ubicada en un servidor remoto mediante el servidor vinculado.