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

Advanced SQL:inserisce l'output della funzione parametrizzata con valori di tabella nella tabella SQL

In questo articolo, dimostrerò quanto segue:

  1. Come inserire l'output di una funzione con valori di tabella in una tabella SQL.
  2. Come inserire l'output di una funzione con valori di tabella creata sul server database remoto.

Che cos'è l'istruzione "Inserisci in"

In RDBMS, "Insert into" è una delle istruzioni SQL di base. Viene utilizzato per inserire nuovi record in una tabella SQL. Utilizzando l'istruzione, possiamo eseguire le seguenti attività:

  • Inserisci nuovi record in una tabella (Inserimento di base).
  • Inserisci i valori di una colonna specifica in una tabella.
  • Inserisci l'output generato da una procedura memorizzata in una tabella SQL.

Per dimostrare quanto sopra, creiamo una tabella denominata "Studenti ” su DemoDatabase. Eseguire il codice seguente per creare la tabella:

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

Esegui inserimento di base

Per eseguire l'inserimento di base, è necessario fornire il nome della tabella di destinazione e i valori della tabella. Quella che segue è una sintassi di base dell'istruzione di inserimento di base:

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

Ad esempio, vogliamo inserire nome, cognome e voto di tre studenti nella tabella "Studenti". Per farlo, esegui il seguente codice:

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

Esegui la query "Seleziona" su "Studente" per rivedere i risultati.

SELECT FIRSTNAME, 
       LASTNAME, 
       ADMISSIONDATE, 
       GRADE 
FROM   STUDENTS

Il risultato è il seguente:

Inserisci i valori di una specifica colonna nella tabella

Per inserire valori in colonne specifiche di una tabella, è necessario fornire il nome della tabella di destinazione e il nome delle colonne in cui si desidera inserire i dati. Quella che segue è la sintassi.

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

Ad esempio, vogliamo inserire il nome e il cognome di due studenti in "Studenti " tavolo. Per farlo, esegui il seguente codice:

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

Esegui la query "Seleziona" rispetto a "Studenti ” tabella.

SELECT FIRSTNAME, 
       LASTNAME, 
       ADMISSIONDATE, 
       GRADE 
FROM   STUDENTS

L'output ha il seguente aspetto:

Inserisci l'output, generato da una procedura memorizzata

Per inserire l'output di una stored procedure nella tabella, è necessario specificare il nome della tabella di destinazione e la stored procedure di origine. Per generare l'output della procedura memorizzata, dobbiamo utilizzare la parola chiave "exec" o "EXECUTE". Quindi, dobbiamo fornire il nome della tabella o i nomi delle colonne seguiti dalla parola chiave "exec". Quella che segue è la sintassi:

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

Ad esempio si vuole inserire l'output della procedura che popola i nominativi degli studenti la cui data di ammissione non è nulla. Per fare ciò, creeremo una procedura memorizzata denominata "spGet_Student_AdmissionDate ”. Per creare una stored procedure, eseguire il codice seguente:

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 volta creata la procedura, esegui la procedura eseguendo il codice seguente:

EXECUTE spGet_Student_Admissiondate

L'output ha il seguente aspetto:

Come accennato in precedenza, vogliamo inserire l'output della stored procedure denominata "spGet_Student_Admissiondate ” in una tabella temporanea. Innanzitutto, esegui il codice seguente per creare la tabella:

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

Una volta creata la tabella, eseguire il codice seguente per inserire l'output di "spGet_Student_Admissiondate ” a “#TempStudents ”.

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

Ora controlliamo l'output di "#TEMPSTUDENTS ”. Per farlo, esegui il seguente codice:

Ora, come accennato in precedenza, dimostrerò come inserire un output generato da una funzione con valori di tabella in una tabella SQL. Per prima cosa, capiamo cos'è una funzione con valori di tabella.

Cos'è la funzione con valori di tabella

Una funzione con valori di tabella è un codice T-SQL speciale che accetta parametri/parametri e, in base alle condizioni definite in una variabile, restituisce il set di risultati nella variabile di tabella. Di seguito sono riportati i vantaggi dell'utilizzo della funzione con valori di tabella:

  1. Può essere eseguito all'interno della query Seleziona.
  2. Può essere utilizzato in più parti di una query, ad esempio nell'istruzione Case, dove/con clausole.
  3. L'output di una funzione con valori di tabella è un recordset, quindi puoi unire la funzione con le tabelle.

Inserisci l'output della funzione inline con valori di tabella nella tabella SQL

In questa sezione spiegherò come inserire l'output di una funzione con valori di tabella in una tabella SQL utilizzando T-SQL.

A scopo dimostrativo, sto utilizzando il database AdventureWorks2014. Ho creato una funzione di tabella multivalore in linea denominata "GetEmployeesbyHireDate .” Questa funzione popola le informazioni dei dipendenti, assunti entro una data e un'ora specifica. La funzione utilizza @FormDate e @Toda te parametri per filtrare i dati. L'output della funzione verrà archiviato in una tabella SQL.

Il codice seguente crea una funzione:

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 query Select, possiamo ottenere l'output di una funzione SQL. Ad esempio, si desidera compilare un elenco di dipendenti assunti entro l'anno 2009. Eseguire la query seguente per ottenere l'elenco:

DECLARE @FROMDT DATETIME 
DECLARE @TODT DATETIME 

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

SELECT * 
FROM   GETEMPLOYEESBYHIREDATE(@FROMDT, @TODT)

L'output della query precedente è il seguente:

Ora, crea una tabella denominata "tblEmploye e" per memorizzare l'output di "GetEmployeesbyHiredate " funzione. Il codice seguente crea la tabella denominata "tblEmployee ”.

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

Come accennato in precedenza, vogliamo popolare le informazioni dei dipendenti, che sono stati assunti nel 2009. Per farlo, inserisci l'output di GetEmployeesbyHireDate funzione in tblEmployees tavolo. Per farlo, esegui il seguente codice:

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)

Verifichiamo che i dati siano stati inseriti nella tabella. Per farlo, esegui il seguente codice:

SELECT * 
FROM   TBLEMPLOYEES

L'output ha il seguente aspetto:

Inserisci dati in tabelle da database remoti

A volte, potresti voler estrarre i dati dai server archiviati in un data center diverso. Questo può essere fatto utilizzando il server collegato a SQL.

In questa sezione spiegherò come inserire l'output della funzione con valori di tabella, creata sul server remoto. Ora per dimostrare lo scenario, la seguente è la configurazione.

[id tabella=57 /]

Nella demo, eseguiremo le seguenti attività:

  1. Sul server di origine (SQL_VM_1 ), crea una funzione con valori di tabella denominata "getCustomerByCountry ” su “AdventureWorks2014 ” database per popolare i dati.
  2. Sul server di destinazione, crea un server collegato denominato "Server_remoto ” per eseguire la funzione (getCustomerByCountry ).
  3. Sul server di destinazione, crea una tabella denominata "Cliente ” per memorizzare i dati, recuperati dalla funzione remota (getCustomerByCountry ).

L'immagine seguente illustra la configurazione.

L'attività da eseguire su un server di origine:

Sul server di origine (SQL_VM_1 ), crea una funzione denominata "getCustomerByCountry .” Popola i dettagli di un cliente che si trova in un paese o una regione specifici. La funzione utilizza @CountryName parametro per filtrare i dati. Eseguire il codice seguente per creare la funzione.

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

Le attività da eseguire sul server di destinazione:

Per popolare i dati dal server di origine (SQL_VM_1 ), in primo luogo, crea un server collegato tra l'origine (SQL_VM_1 ) e la destinazione (SQL_VM_ 2). Esegui il codice seguente sul server di destinazione (SQL_VM_2 ) per creare un server collegato.

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 volta creato il server collegato, creare una tabella SQL per memorizzare le informazioni dei clienti e popolarla eseguendo la funzione SQL, creata sul server di origine (SQL_VM_1 ).

Esegui il codice seguente per creare una tabella.

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

Utilizzando un server collegato, possiamo eseguire la funzione con valori di tabella creata su un server di database remoto. Quando si tenta di eseguire la funzione utilizzando il server collegato, si verifica il seguente errore:

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

Quindi per eseguire qualsiasi funzione sul server remoto, dobbiamo usare la parola chiave OPENQUERY. Viene utilizzato per inizializzare la query distribuita ad hoc utilizzando un server collegato. Fare riferimento a questo articolo per comprendere il concetto di OPENQUERY.

Per utilizzare OPENQUERY, è necessario abilitare il parametro di configurazione avanzato denominato "Query distribuite ad hoc ” sui server di origine e di destinazione. Esegui il codice seguente per abilitarlo.

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

Ora voglio compilare l'elenco dei clienti, che si trovano nel Regno Unito e inserirli nella sezione "Clienti " tavolo. Come accennato, la funzione accetta il nome del paese per filtrare i record. Ora, dobbiamo eseguire il seguente script sul server di destinazione (SQL_VM_2 ) per popolare l'elenco dei clienti che si trovano in “Regno Unito”.

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

L'output ha il seguente aspetto:

Ora, per inserire i dati popolati da nella tabella "Clienti", eseguire il seguente script sul server di destinazione (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)

Verifichiamo ora se i dati sono stati inseriti correttamente. Per verificare, eseguire la query seguente sul server di destinazione (SQL_VM_2).

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

L'output ha il seguente aspetto:

Riepilogo

In questo articolo ho trattato:

  1. Dichiarazione "Insert In" e relativo utilizzo.
  2. Come salvare l'output della funzione con valori di tabella in una tabella SQL.
  3. Come salvare l'output della funzione con valori di tabella nella tabella SQL situata sul server remoto utilizzando il server collegato.