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

Erweitertes SQL:Ausgabe der parametrisierten Tabellenwertfunktion in die SQL-Tabelle einfügen

In diesem Artikel werde ich Folgendes demonstrieren:

  1. Wie man die Ausgabe einer Tabellenwertfunktion in eine SQL-Tabelle einfügt.
  2. Wie man die Ausgabe einer Tabellenwertfunktion einfügt, die auf dem entfernten Datenbankserver erstellt wird.

Was ist die „Insert into“-Anweisung

In RDBMS ist „Einfügen in“ eine der grundlegenden SQL-Anweisungen. Es wird verwendet, um neue Datensätze in eine SQL-Tabelle einzufügen. Mit der Anweisung können wir die folgenden Aufgaben ausführen:

  • Neue Datensätze in eine Tabelle einfügen (Basic Insert).
  • Fügen Sie Werte einer bestimmten Spalte in eine Tabelle ein.
  • Einfügen der von einer gespeicherten Prozedur generierten Ausgabe in eine SQL-Tabelle.

Um das Obige zu demonstrieren, erstellen wir eine Tabelle mit dem Namen „Students “ auf DemoDatabase. Führen Sie den folgenden Code aus, um die Tabelle zu erstellen:

TABELLE STUDENTEN ERSTELLEN ( ID INT IDENTITY(1, 1) PRIMARY KEY, FIRSTNAME VARCHAR(250), LASTNAME VARCHAR(250), ADMISSIONDATE DATETIME, GRAD CHAR(1) )

Grundeinfügung durchführen

Um grundlegende Einfügungen durchzuführen, müssen wir den Namen der Zieltabelle und die Werte der Tabelle angeben. Das Folgende ist eine grundlegende Syntax der grundlegenden Insert-Anweisung:

INSERT INTO  VALUES ( , .. )

Beispielsweise möchten wir Vorname, Nachname und Note von drei Studenten in die Tabelle „Studenten“ einfügen. Führen Sie dazu den folgenden Code aus:

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

Führen Sie die „Select“-Abfrage für „Student“ aus, um die Ergebnisse zu überprüfen.

WÄHLEN SIE VORNAME, NACHNAME, ZULASSUNGSDATUM, BEWERTUNG VON STUDIERENDEN

Das Ergebnis lautet wie folgt:

Werte einer bestimmten Spalte in die Tabelle einfügen

Um Werte in bestimmte Spalten einer Tabelle einzufügen, müssen Sie den Namen der Zieltabelle und den Namen der Spalten angeben, in die Sie Daten einfügen möchten. Das Folgende ist die Syntax.

INSERT IN  ( SPALTE 1 , SPALTE 2 ) WERTE ( , .. )

Zum Beispiel möchten wir den Vornamen und den Nachnamen von zwei Schülern in das Feld „Studenten“ einfügen " Tisch. Führen Sie dazu den folgenden Code aus:

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

Führen Sie die „Select“-Abfrage gegen die „Students ” Tabelle.

WÄHLEN SIE VORNAME, NACHNAME, ZULASSUNGSDATUM, BEWERTUNG VON STUDIERENDEN

Die Ausgabe sieht wie folgt aus:

Fügen Sie die Ausgabe ein, die von einer gespeicherten Prozedur generiert wurde

Um die Ausgabe einer gespeicherten Prozedur in die Tabelle einzufügen, müssen wir den Namen der Zieltabelle und die gespeicherte Quellprozedur angeben. Um die Ausgabe der gespeicherten Prozedur zu generieren, müssen wir das Schlüsselwort „exec“ oder „EXECUTE“ verwenden. Wir müssen also den Tabellennamen oder die Namen der Spalten angeben, gefolgt vom Schlüsselwort „exec“. Das Folgende ist die Syntax:

INSERT INTO  ( SPALTE 1 , SPALTE 2 ) EXEC 

Beispielsweise möchten wir die Ausgabe der Prozedur einfügen, die die Namen der Studenten auffüllt, deren Zulassungsdatum nicht null ist. Dazu erstellen wir eine gespeicherte Prozedur mit dem Namen „spGet_Student_AdmissionDate “. Führen Sie zum Erstellen einer gespeicherten Prozedur den folgenden Code aus:

USE DEMODATABASE GO CREATE PROCEDURE SPGET_STUDENT_ADMISSIONDATE AS BEGIN SELECT ISNULL(FIRSTNAME, '') + ' ' + ISNULL(LASTNAME, '') AS STUDENNAME, ADMISSIONDATE, NOTE OF STUDENTEN WHERE ADMISSIONDATE NOT END

Sobald die Prozedur erstellt ist, führen Sie die Prozedur aus, indem Sie den folgenden Code ausführen:

EXECUTE spGet_Student_Admissiondate

Die Ausgabe sieht wie folgt aus:

Wie oben erwähnt, möchten wir die Ausgabe der gespeicherten Prozedur mit dem Namen „spGet_Student_Admissiondate einfügen “ in einer temporären Tabelle. Führen Sie zunächst den folgenden Code aus, um die Tabelle zu erstellen:

 ( ID INT IDENTITY(1, 1), STUDENTENNAME VARCHAR(250), ADMISSIONDATE DATETIME, GRAD CHAR(1) )

Führen Sie nach Erstellung der Tabelle den folgenden Code aus, um die Ausgabe von „spGet_Student_Admissiondate einzufügen ” zu “#TempStudents “.

INSERT INTO #TEMPSTUDENTS EXECUTE SPGET_STUDENT_ADMISSIONDATE Ausgabe:(3 Zeilen betroffen)

Sehen wir uns nun die Ausgabe von „#TEMPSTUDENTS an “. Führen Sie dazu den folgenden Code aus:

Wie oben erwähnt, werde ich nun demonstrieren, wie wir eine von einer Tabellenwertfunktion generierte Ausgabe in eine SQL-Tabelle einfügen können. Lassen Sie uns zunächst verstehen, was eine Tabellenwertfunktion ist.

Was ist eine Tabellenwertfunktion

Eine Tabellenwertfunktion ist ein spezieller T-SQL-Code, der Parameter/Parameter akzeptiert und basierend auf den in einer Variablen definierten Bedingungen die Ergebnismenge in der Tabellenvariablen zurückgibt. Im Folgenden sind die Vorteile der Verwendung der Tabellenwertfunktion aufgeführt:

  1. Es kann innerhalb der Select-Abfrage ausgeführt werden.
  2. Es kann in mehreren Teilen einer Abfrage verwendet werden, z. B. in der Case-Anweisung, wo/having-Klauseln.
  3. Die Ausgabe einer Tabellenwertfunktion ist ein Recordset, daher können Sie die Funktion mit Tabellen verbinden.

Ausgabe der Inline-Tabellenwertfunktion in SQL-Tabelle einfügen

In diesem Abschnitt werde ich erklären, wie man die Ausgabe einer Tabellenwertfunktion mit T-SQL in eine SQL-Tabelle einfügt.

Zur Demonstration verwende ich die AdventureWorks2014-Datenbank. Ich habe eine Inline-Tabellenfunktion mit mehreren Werten namens „GetEmployeesbyHireDate“ erstellt .“ Diese Funktion füllt Informationen von Mitarbeitern aus, die innerhalb eines bestimmten Datums und einer bestimmten Uhrzeit eingestellt wurden. Die Funktion verwendet das @FormDate und @Toda te Parameter zum Filtern der Daten. Die Ausgabe der Funktion wird in einer SQL-Tabelle gespeichert.

Der folgende Code erstellt eine Funktion:

CREATE FUNCTION GETEMPLOYEESBYHIREDATE (@FROMDATE AS DATETIME, @TODATE AS DATETIME) GIBT TABELLE @MITARBEITER ZURÜCK (MITARBEITERNAME VARCHAR (MAX), GEBURTSDATUM DATUMZEIT, JOBTITLE VARCHAR(150), EMAILID VARCHAR(100), PHONENUMBER VARCHAR(20), HIREDATE DATETIME ) AS BEGIN INSERT INTO @EMPLOYEES SELECT ( ISNULL( B.VORNAME, '') + ' ' + ISNULL( B.MITTELNAME, '') + ' ' + ISNULL( B.NACHNAME, '') )AS EMPLOYEENAME, A .GEBURTSDATUM, B.JOBBEZEICHNUNG, B.E-MAILADRESSE, B.TELEFONNUMMER, A.EINSTELLUNG VON [PERSONAL].[MITARBEITER] A INNER JOIN [PERSONAL].[VEMPLOYEE] B ON A.UNTERNEHMENSID =B.UNTERNEHMENSID, WO A.EINSTELLUNG ZWISCHEN @FROMDATE UND @TODATE RETURN END

Mit der Select-Abfrage können wir die Ausgabe einer SQL-Funktion erhalten. Sie möchten beispielsweise eine Liste von Mitarbeitern ausfüllen, die im Jahr 2009 eingestellt wurden. Führen Sie die folgende Abfrage aus, um die Liste zu erhalten:

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

Die Ausgabe der obigen Abfrage sieht wie folgt aus:

Erstellen Sie nun eine Tabelle mit dem Namen „tblEmploye e“, um die Ausgabe von „GetEmployeesbyHiredate zu speichern ” Funktion. Der folgende Code erstellt die Tabelle mit dem Namen „tblEmployee “.

TABELLE ARBEITNEHMER ERSTELLEN ( MITARBEITERNAME VARCHAR (MAX), GEBURTSDATUM DATUM, STELLENBEZEICHNUNG VARCHAR(150), E-MAILID VARCHAR(100), TELEFONNUMMER VARCHAR(20), EINSTELLUNG DATUM )

Wie ich bereits erwähnt habe, möchten wir die Informationen der Mitarbeiter ausfüllen, die 2009 eingestellt wurden. Fügen Sie dazu die Ausgabe von GetEmployeesbyHireDate ein Funktion in den tblEmployees Tisch. Führen Sie dazu den folgenden Code aus:

DECLARE @FROMDT DATETIME DECLARE @TODT DATETIME SET @FROMDT='2009-01-01' SET @TODT='2009-12-31' EINFÜGEN IN TABELLENMITARBEITER AUSWÄHLEN MITARBEITERNAME, GEBURTSDATUM, STELLENBEZEICHNUNG, E-MAIL-ID, TELEFONNUMMER, EINSTELLUNG VON GETEMPLOYEESBYHIREDATE (@FROMDT, @TODT)

Lassen Sie uns überprüfen, ob Daten in die Tabelle eingefügt wurden. Führen Sie dazu den folgenden Code aus:

WÄHLEN SIE * VON TBLEMITARBEITERN AUS

Die Ausgabe sieht wie folgt aus:

Daten in Tabellen aus entfernten Datenbanken einfügen

Manchmal möchten Sie vielleicht Daten von den Servern extrahieren, die in einem anderen Rechenzentrum gespeichert sind. Dies kann mit dem SQL Linked Server erfolgen.

In diesem Abschnitt werde ich erklären, wie die Ausgabe der Tabellenwertfunktion eingefügt wird, die auf dem Remote-Server erstellt wurde. Um nun das Szenario zu demonstrieren, folgt das Setup.

[Tabellen-ID=57 /]

In der Demo führen wir die folgenden Aufgaben aus:

  1. Auf dem Quellserver (SQL_VM_1 ), erstellen Sie eine Tabellenwertfunktion mit dem Namen „getCustomerByCountry “ auf der „AdventureWorks2014 ” Datenbank, um die Daten zu füllen.
  2. Erstellen Sie auf dem Zielserver einen Verbindungsserver mit dem Namen „Remote_Server ” um die Funktion auszuführen (getCustomerByCountry ).
  3. Erstellen Sie auf dem Zielserver eine Tabelle mit dem Namen „Kunde ” zum Speichern von Daten, die von der Remote-Funktion abgerufen wurden (getCustomerByCountry ).

Das folgende Bild veranschaulicht die Einrichtung.

Auf einem Quellserver auszuführende Aufgabe:

Auf dem Quellserver (SQL_VM_1 ), erstellen Sie eine Funktion mit dem Namen „getCustomerByCountry .“ Es füllt Details eines Kunden aus, der sich in einem bestimmten Land oder einer bestimmten Region befindet. Die Funktion verwendet den @CountryName Parameter zum Filtern der Daten. Führen Sie den folgenden Code aus, um die Funktion zu erstellen.

Alter FUNCTION Getcustomerbycountry(@CountryName VARCHAR)gibt @Customers TABLE (Kundenname VARCHAR(500), Telefonnummer VARCHAR(50), E-Mail-Adresse VARCHAR(100), Adresse VARCHAR(max), Stadt VARCHAR(150), Land VARCHAR(250) zurück ), Postleitzahl VARCHAR(50))AS BEGIN INSERT INTO @Customers SELECT Kundenname, Telefonnummer, E-Mail-Adresse, Adresse, Stadt, Land, Postleitzahl FROM Kunden WHERE Land [email protected] RETURN END

Auf dem Zielserver auszuführende Aufgaben:

Um Daten vom Quellserver (SQL_VM_1 ), erstellen Sie zunächst einen Verbindungsserver zwischen der Quelle (SQL_VM_1 ) und Ziel (SQL_VM_ 2). Führen Sie den folgenden Code auf dem Zielserver aus (SQL_VM_2 ), um einen Verbindungsserver zu erstellen.

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'DATENZUGRIFF', @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'CONNECT TIMEOUT', @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

Sobald der Verbindungsserver erstellt ist, erstellen Sie eine SQL-Tabelle, um die Informationen der Kunden zu speichern, und füllen Sie sie, indem Sie die SQL-Funktion ausführen, die auf dem Quellserver erstellt wurde (SQL_VM_1 ).

Führen Sie den folgenden Code aus, um eine Tabelle zu erstellen.

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), PLZ VARCHAR(50) )

Mit einem Verbindungsserver können wir die Tabellenwertfunktion ausführen, die auf einem entfernten Datenbankserver erstellt wurde. Wenn Sie versuchen, die Funktion mit einem Verbindungsserver auszuführen, tritt der folgende Fehler auf:

Msg 4122, Level 16, State 1, Line 28Remote-Tabellenwertfunktionsaufrufe sind nicht zulässig.

Um also eine Funktion auf dem Remote-Server auszuführen, müssen wir das Schlüsselwort OPENQUERY verwenden. Es wird verwendet, um die verteilte Ad-hoc-Abfrage unter Verwendung eines Verbindungsservers zu initialisieren. Lesen Sie diesen Artikel, um das Konzept von OPENQUERY zu verstehen.

Um OPENQUERY verwenden zu können, müssen wir den erweiterten Konfigurationsparameter „Ad Hoc Distributed Queries“ aktivieren “ auf den Quell- und Zielservern. Führen Sie den folgenden Code aus, um ihn zu aktivieren.

USE MASTERGOEXEC SP_CONFIGURE 'ERWEITERTE OPTION ANZEIGEN', 1NEUKONFIGURIEREN MIT OVERRIDEEXEC SP_CONFIGURE 'AD HOC DISTRIBUTED QUERIES', 1NEUKONFIGURIEREN MIT OVERRIDE

Jetzt möchte ich die Liste der Kunden aus dem Vereinigten Königreich füllen und sie in die „Kunden einfügen " Tisch. Wie ich bereits erwähnt habe, akzeptiert die Funktion den Ländernamen, um die Datensätze zu filtern. Jetzt müssen wir das folgende Skript auf dem Zielserver ausführen (SQL_VM_2 ), um die Liste der Kunden in „Vereinigtes Königreich“ zu füllen.

WÄHLEN SIE 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 +'''')' )

Die Ausgabe sieht wie folgt aus:

Um nun Daten einzufügen, die mit in die Tabelle „Kunden“ gefüllt wurden, führen Sie das folgende Skript auf dem Zielserver aus (SQL_VM_2 ).

IN KUNDEN EINFÜGEN (KUNDENNAME, TELEFONNUMMER, E-MAIL-ADRESSE, ADRESSE, STADT, LAND, PLZ) WÄHLEN SIE KUNDENNAME, TELEFONNUMMER, E-MAIL-ADRESSE, ADRESSE, STADT, LAND, PLZ AUS OPENQUERY([TTI609-VM2], 'DECLARE @COUNTRY VARCHAR( 150)SET @COUNTRY=''UNITED KINGDOM'' SELECT * FROM [ADVENTUREWORKS2014].DBO.GETCUSTOMERBYCOUNTRY(''''+ @COUNTRY +'''')' )/*Output*/(1913 Zeilen betroffen) 

Lassen Sie uns nun überprüfen, ob die Daten richtig eingefügt wurden. Führen Sie zur Überprüfung die folgende Abfrage auf dem Zielserver (SQL_VM_2) aus.

VERWENDEN SIE DEMODATABASEGOSELECT TOP 20 KUNDENNAME, TELEFONNUMMER, E-MAILADRESSE, ADRESSE, STADT, LAND, PLZ VON KUNDEN

Die Ausgabe sieht wie folgt aus:

Zusammenfassung

In diesem Artikel habe ich behandelt:

  1. "Insert Into"-Anweisung und ihre Verwendung.
  2. So speichern Sie die Ausgabe der Tabellenwertfunktion in einer SQL-Tabelle.
  3. So speichern Sie die Ausgabe der Tabellenwertfunktion mithilfe von Linked Server in der SQL-Tabelle auf dem Remote-Server.