In questo articolo, dimostrerò quanto segue:
- Come inserire l'output di una funzione con valori di tabella in una tabella SQL.
- 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:
- Può essere eseguito all'interno della query Seleziona.
- Può essere utilizzato in più parti di una query, ad esempio nell'istruzione Case, dove/con clausole.
- 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à:
- Sul server di origine (SQL_VM_1 ), crea una funzione con valori di tabella denominata "getCustomerByCountry ” su “AdventureWorks2014 ” database per popolare i dati.
- Sul server di destinazione, crea un server collegato denominato "Server_remoto ” per eseguire la funzione (getCustomerByCountry ).
- 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:
- Dichiarazione "Insert In" e relativo utilizzo.
- Come salvare l'output della funzione con valori di tabella in una tabella SQL.
- Come salvare l'output della funzione con valori di tabella nella tabella SQL situata sul server remoto utilizzando il server collegato.