Database
 sql >> Base de données >  >> RDS >> Database

SQL avancé :insérer la sortie de la fonction table paramétrée dans la table SQL

Dans cet article, je vais démontrer ce qui suit :

  1. Comment insérer la sortie d'une fonction table dans une table SQL.
  2. Comment insérer la sortie d'une fonction table créée sur le serveur de base de données distant.

Qu'est-ce que l'instruction "Insérer dans" ?

Dans RDBMS, "Insert into" est l'une des instructions SQL de base. Il est utilisé pour insérer de nouveaux enregistrements dans une table SQL. À l'aide de l'instruction, nous pouvons effectuer les tâches suivantes :

  • Insérer de nouveaux enregistrements dans un tableau (Insertion de base).
  • Insérer les valeurs d'une colonne spécifique dans un tableau.
  • Insérer la sortie générée par une procédure stockée dans une table SQL.

Pour illustrer ce qui précède, créons un tableau nommé "Étudiants ” sur DemoDatabase. Exécutez le code suivant pour créer la table :

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

Effectuer une insertion de base

Pour effectuer une insertion de base, nous devons fournir le nom de la table cible et les valeurs de la table. Voici une syntaxe de base de l'instruction d'insertion de base :

INSERT INTO  VALUES ( , .. )

Par exemple, nous voulons insérer le prénom, le nom de famille et la troisième année des élèves dans le tableau « Élèves ». Pour cela, exécutez le code suivant :

INSÉRER DANS LES VALEURS DES ÉTUDIANTS ('NISARG', 'UPADHYAY', '2018-09-11', 'A'), ('RAGHAV', 'DATTA', '2017-10-01', 'A') , ('KIRAN', 'AMIN', '2016-01-31', 'A')

Exécutez la requête "Sélectionner" sur "Étudiant" pour examiner les résultats.

SÉLECTIONNER PRÉNOM, NOM, DATE D'ADMISSION, NOTE DES ÉTUDIANTS

Le résultat est le suivant :

Insérer les valeurs d'une colonne spécifique dans le tableau

Pour insérer des valeurs dans des colonnes spécifiques d'une table, vous devez fournir le nom de la table cible et le nom des colonnes dans lesquelles vous souhaitez insérer des données. Voici la syntaxe.

INSERT INTO  ( COLUMN 1 , COLUMN 2 ) VALUES ( , .. )

Par exemple, nous voulons insérer le prénom et le nom de deux étudiants dans le champ "Étudiants " table. Pour cela, exécutez le code suivant :

INSÉRER DANS LES ÉTUDIANTS (PRÉNOM, NOM) LES VALEURS ('NIMESH', 'UPADHYAY'), ('RUPESH', 'DATTA')

Exécutez la requête "Sélectionner" sur les "Étudiants ” tableau.

SÉLECTIONNER PRÉNOM, NOM, DATE D'ADMISSION, NOTE DES ÉTUDIANTS

La sortie ressemble à ceci :

Insérer la sortie, générée par une procédure stockée

Pour insérer la sortie d'une procédure stockée dans la table, nous devons spécifier le nom de la table cible et la procédure stockée source. Pour générer la sortie de la procédure stockée, nous devons utiliser le mot-clé "exec" ou "EXECUTE". Nous devons donc fournir le nom de la table ou les noms des colonnes suivis du mot-clé "exec". Voici la syntaxe :

INSERT INTO  (COLONNE 1, COLONNE 2) EXEC 

Par exemple, on veut insérer la sortie de la procédure qui renseigne les noms des étudiants dont la date d'admission n'est pas nulle. Pour ce faire, nous allons créer une procédure stockée nommée "spGet_Student_AdmissionDate ”. Pour créer une procédure stockée, exécutez le code suivant :

UTILISER 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

Une fois la procédure créée, lancez la procédure en exécutant le code suivant :

EXÉCUTER spGet_Student_Admissiondate

La sortie ressemble à ceci :

Comme je l'ai mentionné ci-dessus, nous voulons insérer la sortie de la procédure stockée nommée "spGet_Student_Admissiondate ” dans une table temporaire. Tout d'abord, exécutez le code suivant pour créer la table :

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

Une fois la table créée, exécutez le code suivant pour insérer la sortie de "spGet_Student_Admissiondate ” à “#TempsÉtudiants ”.

INSERT INTO #TEMPSTUDENTS EXECUTE SPGET_STUDENT_ADMISSIONDATE Sortie :(3 lignes affectées)

Vérifions maintenant la sortie de "#TEMPSTUDENTS ”. Pour cela, exécutez le code suivant :

Maintenant, comme je l'ai mentionné ci-dessus, je vais montrer comment insérer une sortie générée par une fonction table dans une table SQL. Tout d'abord, comprenons ce qu'est une fonction table.

Qu'est-ce qu'une fonction de table ?

Une fonction table est un code T-SQL spécial qui accepte le ou les paramètres et, en fonction des conditions définies dans une variable, renvoie le jeu de résultats dans la variable de table. Voici les avantages de l'utilisation de la fonction table :

  1. Il peut être exécuté dans la requête Select.
  2. Il peut être utilisé dans plusieurs parties d'une requête, par exemple dans l'instruction Case, les clauses where/having.
  3. La sortie d'une fonction table est un jeu d'enregistrements, vous pouvez donc joindre la fonction avec des tables.

Insérer la sortie de la fonction de table en ligne dans la table SQL

Dans cette section, je vais expliquer comment insérer la sortie d'une fonction table dans une table SQL à l'aide de T-SQL.

Pour la démonstration, j'utilise la base de données AdventureWorks2014. J'ai créé une fonction de table à valeurs multiples en ligne nommée "GetEmployeesbyHireDate .” Cette fonction remplit les informations des employés, embauchés à une date et une heure spécifiques. La fonction utilise le @FormDate et @Toda te paramètres pour filtrer les données. La sortie de la fonction sera stockée dans une table SQL.

Le code suivant crée une fonction :

CREATE FUNCTION GETTEMPLOYEESBYHIREDATE (@FROMDATE AS DATETIME, @TODATE AS DATETIME) RETOURNE @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 ENTRE @FROMDATE ET @TODATE RETURN END

En utilisant la requête Select, nous pouvons obtenir la sortie d'une fonction SQL. Par exemple, vous souhaitez remplir une liste d'employés recrutés en 2009. Exécutez la requête suivante pour obtenir la liste :

DECLARE @FROMDT DATETIME DECLARE @TODT DATETIME SET @FROMDT='2009-01-01' SET @TODT='2009-12-31' SELECT * FROM GETEMPLOYEESBYHIREDATE(@FROMDT, @TODT)

Le résultat de la requête ci-dessus se présente comme suit :

Maintenant, créez une table nommée "tblEmploye e" pour stocker la sortie de "GetEmployeesbyHiredate " une fonction. Le code suivant crée la table nommée "tblEmployee ”.

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

Comme je l'ai mentionné plus tôt, nous voulons remplir les informations des employés qui ont été embauchés en 2009. Pour ce faire, insérez la sortie de GetEmployeesbyHireDate fonction dans le tblEmployees table. Pour cela, exécutez le code suivant :

DECLARE @FROMDT DATETIME DECLARE @TODT DATETIME SET @FROMDT='2009-01-01' SET @TODT='2009-12-31' INSERT INTO TBLEEMPLOYEES SELECT EMPLOYEENAME, BIRTHDATE, JOBTITLE, EMAILID, PHONENUMBER, HIREDATE FROM GETEMPLOYEESBYHIREDATE (@FROMDT, @TODT)

Vérifions que les données ont été insérées dans la table. Pour cela, exécutez le code suivant :

SELECT * FROM TBEMPLOYES

La sortie ressemble à ceci :

Insérer des données dans des tables à partir de bases de données distantes

Parfois, vous souhaiterez peut-être extraire des données des serveurs stockés dans un centre de données différent. Cela peut être fait en utilisant le serveur lié SQL.

Dans cette section, j'expliquerai comment insérer la sortie de la fonction de valeur table, créée sur le serveur distant. Maintenant, pour illustrer le scénario, voici la configuration.

[identifiant de table=57 /]

Dans la démo, nous effectuerons les tâches suivantes :

  1. Sur le serveur source (SQL_VM_1 ), créez une fonction table nommée "getCustomerByCountry " sur le "AdventureWorks2014 ” base de données pour remplir les données.
  2. Sur le serveur de destination, créez un serveur lié nommé "Remote_Server ” pour exécuter la fonction (getCustomerByCountry ).
  3. Sur le serveur de destination, créez une table nommée "Client ” pour stocker des données, récupérées par la fonction distante (getCustomerByCountry ).

L'image suivante illustre la configuration.

La tâche à effectuer sur un serveur source :

Sur le serveur source (SQL_VM_1 ), créez une fonction nommée "getCustomerByCountry .” Il remplit les détails d'un client situé dans un pays ou une région spécifique. La fonction utilise le @CountryName paramètre pour filtrer les données. Exécutez le code suivant pour créer la fonction.

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) ), code postal VARCHAR(50))AS BEGIN INSERT INTO @Customers SELECT customer_name, phoennumber, emailaddress, address, city, country, postalcode FROM clients WHERE country [email protected] RETURN END

Les tâches à effectuer sur le serveur de destination :

Pour remplir les données du serveur source (SQL_VM_1 ), commencez par créer un serveur lié entre la source (SQL_VM_1 ) et destination (SQL_VM_ 2). Exécutez le code suivant sur le serveur de destination (SQL_VM_2 ) pour créer un serveur lié.

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

Une fois le serveur lié créé, créez une table SQL pour stocker les informations des clients, et alimentez-la en exécutant la fonction SQL, créée sur le serveur source (SQL_VM_1 ).

Exécutez le code suivant pour créer une table.

USE DEMODATABASEGOCREATE 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), CODE POSTAL VARCHAR(50) )

À l'aide d'un serveur lié, nous pouvons exécuter la fonction table créée sur un serveur de base de données distant. Lorsque vous essayez d'exécuter la fonction à l'aide du serveur lié, l'erreur suivante se produit :

Msg 4122, Niveau 16, État 1, Ligne 28Les appels de fonction table à distance ne sont pas autorisés.

Par conséquent, pour exécuter une fonction sur le serveur distant, nous devons utiliser le mot-clé OPENQUERY. Il est utilisé pour initialiser la requête distribuée ad hoc à l'aide d'un serveur lié. Reportez-vous à cet article pour comprendre le concept d'OPENQUERY.

Pour utiliser OPENQUERY, nous devons activer le paramètre de configuration avancé nommé "Requêtes distribuées ad hoc ” sur les serveurs source et destination. Exécutez le code suivant pour l'activer.

UTILISER MASTERGOEXEC SP_CONFIGURE 'AFFICHER L'OPTION AVANCÉE', 1RECONFIGURER AVEC OVERRIDEEXEC SP_CONFIGURE 'REQUETES DISTRIBUÉES AD HOC', 1RECONFIGURER AVEC OVERRIDE

Maintenant, je souhaite remplir la liste des clients, situés au Royaume-Uni et les insérer dans le champ "Clients " table. Comme je l'ai mentionné, la fonction accepte le nom du pays pour filtrer les enregistrements. Maintenant, nous devons exécuter le script suivant sur le serveur de destination (SQL_VM_2 ) pour renseigner la liste des clients situés au "Royaume-Uni".

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

La sortie ressemble à ceci :

Maintenant, pour insérer des données renseignées par dans la table "Clients", exécutez le script suivant sur le serveur de destination (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=''ROYAUME-UNI'' SELECT * FROM [ADVENTUREWORKS2014].DBO.GETCUSTOMERBYCOUNTRY(''''+ @COUNTRY +'''')' )/*Sortie*/(1913 lignes concernées) 

Vérifions maintenant si les données ont été insérées correctement. Pour vérifier, exécutez la requête suivante sur le serveur de destination (SQL_VM_2).

UTILISER DEMODATABASEGOSELECT TOP 20 CUSTOMER_NAME, PHONENUMBER, EMAILADDRESS, ADDRESS, CITY, COUNTRY, POSTALCODE FROM CUSTOMERS

La sortie ressemble à ceci :

Résumé

Dans cet article, j'ai couvert :

  1. Instruction "Insérer dans" et son utilisation.
  2. Comment enregistrer la sortie de la fonction table dans une table SQL.
  3. Comment enregistrer la sortie de la fonction table dans la table SQL située sur le serveur distant à l'aide du serveur lié.