sql >> Database >  >> RDS >> Database

Geavanceerde SQL:uitvoer van de geparametriseerde functie met tabelwaarde in SQL-tabel invoegen

In dit artikel ga ik het volgende demonstreren:

  1. Hoe de uitvoer van een functie met tabelwaarde in een SQL-tabel in te voegen.
  2. Hoe de uitvoer van een functie met tabelwaarde in te voegen die is gemaakt op de externe databaseserver.

Wat is de instructie "Invoegen in"

In RDBMS is "Invoegen in" een van de standaard SQL-instructies. Het wordt gebruikt om nieuwe records in een SQL-tabel in te voegen. Met behulp van de verklaring kunnen we de volgende taken uitvoeren:

  • Voeg nieuwe records in een tabel in (Basic Insert).
  • Voeg waarden van een specifieke kolom in een tabel in.
  • Voeg de uitvoer die is gegenereerd door een opgeslagen procedure in een SQL-tabel in.

Laten we om het bovenstaande te demonstreren een tabel maken met de naam "Studenten ” op DemoDatabase. Voer de volgende code uit om de tabel te maken:

MAAK TABEL STUDENTEN (ID INT IDENTITEIT (1, 1) PRIMAIRE SLEUTEL, VOORNAAM VARCHAR(250), ACHTERNAAM VARCHAR(250), TOELATINGSDATUM DATUMTIJD, GRADE CHAR(1))

Voer basisinvoeging uit

Om elementaire invoeging uit te voeren, moeten we de naam van de doeltabel en waarden van de tabel opgeven. Het volgende is een basissyntaxis van de basisinvoeginstructie:

INSERT INTO  WAARDEN ( , .. )

We willen bijvoorbeeld de voornaam, achternaam en het cijfer van drie studenten in de tabel "Studenten" invoegen. Voer hiervoor de volgende code uit:

INVOER IN STUDENTENWAARDEN ('NISARG', 'UPADHYAY', '2018-09-11', 'A'), ('RAGHAV', 'DATTA', '2017-10-01', 'A') , ('KIRAN', 'AMIN', '2016-01-31', 'A')

Voer de "Selecteer"-query uit tegen "Student" om de resultaten te bekijken.

SELECTEER VOORNAAM, ACHTERNAAM, TOELATINGSDATUM, RANG VAN STUDENTEN

Het resultaat is als volgt:

Voeg waarden van een specifieke kolom in de tabel in

Als u waarden in specifieke kolommen van een tabel wilt invoegen, moet u de naam van de doeltabel en de naam van de kolommen waarin u gegevens wilt invoegen opgeven. Het volgende is de syntaxis.

VOEG IN IN  ( KOLOM 1 , KOLOM 2 ) WAARDEN ( , .. )

We willen bijvoorbeeld de voornaam en achternaam van twee studenten invoegen in de "Studenten " tafel. Voer hiervoor de volgende code uit:

INVOER IN STUDENTEN (FIRSTNAME, LASTNAME) WAARDEN ('NIMESH', 'UPADHYAY'), ('RUPESH', 'DATTA')

Voer de "Select"-query uit tegen de "Studenten ” tabel.

SELECTEER VOORNAAM, ACHTERNAAM, TOELATINGSDATUM, RANG VAN STUDENTEN

De uitvoer ziet er als volgt uit:

Voer de uitvoer in, genereer door een opgeslagen procedure

Om de uitvoer van een opgeslagen procedure in de tabel in te voegen, moeten we de naam van de doeltabel en de opgeslagen bronprocedure specificeren. Om de uitvoer van de opgeslagen procedure te genereren, moeten we het sleutelwoord "exec" of "EXECUTE" gebruiken. We moeten dus de tabelnaam of namen van de kolommen opgeven, gevolgd door het sleutelwoord "exec". Het volgende is de syntaxis:

INVOEREN IN  (KOLOM 1, KOLOM 2) EXEC 

We willen bijvoorbeeld de uitvoer van de procedure invoegen die de namen bevat van de studenten van wie de toelatingsdatum niet nul is. Om dat te doen, maken we een opgeslagen procedure met de naam "spGet_Student_AdmissionDate ”. Voer de volgende code uit om een ​​opgeslagen procedure aan te maken:

GEBRUIK DEMODATABASE GO MAAK PROCEDURE SPGET_STUDENT_ADMISSIONDATE ALS BEGIN SELECTEER ISNULL(FIRSTNAME, '') + ' ' + ISNULL(Achternaam, '') ALS STUDENTNAME, TOELATINGSDATUM, RANG VAN STUDENTEN WAAR DE DATUM VAN TOELATING NIET NAAR TOELATINGSDATUM IS 

Nadat de procedure is gemaakt, voert u de procedure uit door de volgende code uit te voeren:

UITVOEREN spGet_Student_Admissiondate

De uitvoer ziet er als volgt uit:

Zoals ik hierboven al zei, willen we de uitvoer van de opgeslagen procedure met de naam "spGet_Student_Admissiondate invoegen ” in een tijdelijke tabel. Voer eerst de volgende code uit om de tabel te maken:

 ( ID INT IDENTITY(1, 1), STUDENTNAME VARCHAR(250), TOELATINGSDATUM DATUMTIJD, GRADE CHAR(1) )

Nadat de tabel is gemaakt, voert u de volgende code uit om de uitvoer van "spGet_Student_Admissiondate in te voegen ” naar “#TempStudents ”.

INSERT INTO #TEMPSTUDENTS EXECUTE SPGET_STUDENT_ADMISSIONDATE Uitvoer:(3 rijen beïnvloed)

Laten we nu eens kijken naar de uitvoer van "#TEMPSTUDENTS ”. Voer hiervoor de volgende code uit:

Zoals ik hierboven al zei, ga ik demonstreren hoe we een uitvoer kunnen invoegen die is gegenereerd door een functie met tabelwaarde in een SQL-tabel. Laten we eerst eens kijken wat een functie met tabelwaarde is.

Wat is een tabelwaarde-functie

Een functie met tabelwaarde is een speciale T-SQL-code die parameter/parameters accepteert en op basis van de voorwaarden die in een variabele zijn gedefinieerd, het resultaat retourneert dat in de tabelvariabele is ingesteld. Dit zijn de voordelen van het gebruik van de functie tabelwaarde:

  1. Het kan worden uitgevoerd binnen de Select-query.
  2. Het kan in meerdere delen van een zoekopdracht worden gebruikt, bijvoorbeeld in de Case-instructie, waar/met clausules.
  3. De uitvoer van een functie met tabelwaarde is een recordset, dus u kunt de functie samenvoegen met tabellen.

Uitvoer van inline tabelwaardefunctie in SQL-tabel invoegen

In deze sectie ga ik uitleggen hoe je de uitvoer van een functie met tabelwaarde in een SQL-tabel kunt invoegen met behulp van T-SQL.

Voor demonstratie gebruik ik de AdventureWorks2014-database. Ik heb een inline tabelfunctie met meerdere waarden gemaakt met de naam "GetEmployeesbyHireDate .” Deze functie vult informatie in van medewerkers die binnen een bepaalde datum en tijd zijn ingehuurd. De functie gebruikt de @FormDate en @Toda te parameters om de gegevens te filteren. De uitvoer van de functie wordt opgeslagen in een SQL-tabel.

De volgende code creëert een functie:

FUNCTIE MAKEN GETEMPLOYEESBYHIREDATE (@FROMDATE AS DATETIME, @TODATE AS DATETIME) RETURNS @EMPLOYEES TABLE ( WERKNEMERSNAAM VARCHAR (MAX), GEBOORTEDATUM DATETIME, JOBTITLE VARCHAR (150), EMAILID VARCHAR (100 HI VAR PHONENUM), DATETIME ) AS BEGIN INSERT IN TO @EMPLOYEES SELECT ( ISNULL( B.FIRSTNAME, '') + ' ' + ISNULL( B.MIDDLENAME, '') + ' ' + ISNULL( B.LAASTNAME, '') )AS EMPLOYEENAME, A .GEBOORTEDATUM, B.JOBTITLE, B.EMAILADDRESS, B.TELEFOONNUMMER, A.GEHUURD VAN [HUMANRESOURCES].[MEDEWERKER] A INNER WORDT BIJ [HUMANRESOURCES].[WERKNEMER] B OP A.BUSINESSENTITYID =B.BUSINESSENTITYID TUSSEN A.HIREDATE @FROMDATE EN @TODATE TERUGKEER EINDE

Met behulp van de Select-query kunnen we de uitvoer van een SQL-functie krijgen. U wilt bijvoorbeeld een lijst met werknemers vullen die in het jaar 2009 zijn aangeworven. Voer de volgende zoekopdracht uit om de lijst te krijgen:

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

De uitvoer van de bovenstaande query ziet er als volgt uit:

Maak nu een tabel met de naam "tblEmploye e” om de uitvoer van de “GetEmployeesbyHiredate . op te slaan ” functie. De volgende code maakt de tabel met de naam "tblEmployee ”.

MAAK TABEL TBLEEMPLOYEES ( WERKNEMERNAAM VARCHAR (MAX), GEBOORTEDATUM DATETIME, JOBTITLE VARCHAR (150), EMAILID VARCHAR (100), TELEFOONNUMMER VARCHAR (20), HIREDATE DATETIME )

Zoals ik eerder al zei, willen we de informatie invullen van de werknemers die in 2009 zijn aangenomen. Om dat te doen, voegt u de uitvoer van de GetEmployeesbyHireDate in. functie in de tblEmployees tafel. Voer hiervoor de volgende code uit:

DECLARE @FROMDT DATETIME DECLARE @TODT DATETIME SET @FROMDT='2009-01-01' SET @TODT='2009-12-31' INSERT IN TBLEMPLOYEES SELECTEER WERKNEMERNAAM, GEBOORTEDATUM, JOBTITLE, EMAILID, TELEFOONNUMMER, GEHULDIGDE VAN GETEHIREDEES (@FROMDT, @TODT)

Laten we controleren of de gegevens in de tabel zijn ingevoegd. Voer hiervoor de volgende code uit:

SELECTEER * VAN TBLEMPLOYEES

De uitvoer ziet er als volgt uit:

Gegevens in tabellen van externe databases invoegen

Soms wilt u misschien gegevens extraheren van de servers die in een ander datacenter zijn opgeslagen. Dit kan worden gedaan met behulp van SQL Linked server.

In dit gedeelte zal ik uitleggen hoe u de uitvoer van de functie met tabelwaarde invoegt, gemaakt op de externe server. Om het scenario te demonstreren, is het volgende de opzet.

[tabel id=57 /]

In de demo zullen we de volgende taken uitvoeren:

  1. Op de bronserver (SQL_VM_1 ), maak een functie met tabelwaarde met de naam "getCustomerByCountry ” op de “AdventureWorks2014 ” database om de gegevens te vullen.
  2. Maak op de doelserver een gekoppelde server met de naam "Remote_Server ” om de functie uit te voeren (getCustomerByCountry ).
  3. Maak op de doelserver een tabel met de naam 'Klant ” om gegevens op te slaan, opgehaald door de externe functie (getCustomerByCountry ).

De volgende afbeelding illustreert de opstelling.

De taak die moet worden uitgevoerd op een bronserver:

Op de bronserver (SQL_VM_1 ), maak een functie aan met de naam "getCustomerByCountry .” Het vult details van een klant die zich in een specifiek land of een specifieke regio bevindt. De functie gebruikt de @CountryName parameter om de gegevens te filteren. Voer de volgende code uit om de functie te maken.

Wijzig FUNCTIE Getcustomerbycountry(@CountryName VARCHAR)retourneert @Customers TABLE ( klantnaam VARCHAR(500), phoennumber VARCHAR(50), e-mailadres VARCHAR(100), adres VARCHAR(max), plaats VARCHAR(150), land VARCHAR(250 ), postcode VARCHAR(50))AS BEGIN INSERT INTO @Customers SELECT klantnaam, telefoonnummer, e-mailadres, adres, stad, land, postcode FROM klanten WAAR land [email protected] RETURN END

De taken die moeten worden uitgevoerd op Destination Server:

Gegevens invullen vanaf de bronserver (SQL_VM_1 ), maak eerst een gekoppelde server tussen de bron (SQL_VM_1 ) en bestemming (SQL_VM_ 2). Voer de volgende code uit op de doelserver (SQL_VM_2 ) om een ​​gekoppelde server te maken.

GEBRUIK [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'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 TRANSACTIE PROMOTIE', @OPTVALUE=N'FALSE'GO

Nadat de gekoppelde server is gemaakt, maakt u een SQL-tabel om de informatie van klanten op te slaan en vult u deze door de SQL-functie uit te voeren, gemaakt op de bronserver (SQL_VM_1 ).

Voer de volgende code uit om een ​​tabel te maken.

GEBRUIK DEMODATABASEGOCREATE TABEL KLANTEN ( ID INT IDENTITY(1, 1), CUSTOMER_NAME VARCHAR(500), PHONENUMBER VARCHAR(50), EMAILADRES VARCHAR(100), ADRES VARCHAR(MAX), STAD VARCHAR(150), LAND VARCHAR( 250), POSTCODE VARCHAR(50) )

Met behulp van een gekoppelde server kunnen we de functie met tabelwaarde uitvoeren die is gemaakt op een externe databaseserver. Wanneer u de functie probeert uit te voeren met behulp van de gekoppelde server, treedt de volgende fout op:

Msg 4122, niveau 16, staat 1, regel 28 Externe functieaanroepen met tabelwaarde zijn niet toegestaan.

Om een ​​functie op de externe server uit te voeren, moeten we daarom het sleutelwoord OPENQUERY gebruiken. Het wordt gebruikt om de ad-hoc gedistribueerde query te initialiseren met behulp van een gekoppelde server. Raadpleeg dit artikel om het concept van OPENQUERY te begrijpen.

Om OPENQUERY te gebruiken, moeten we de geavanceerde configuratieparameter met de naam 'Ad-hoc gedistribueerde zoekopdrachten inschakelen ” op de bron- en doelservers. Voer de volgende code uit om het in te schakelen.

MASTERGOEXEC SP_CONFIGURE 'TOEN GEAVANCEERDE OPTIE', 1HERCONFIGUREER MET OVERRIDEEXEC SP_CONFIGURE 'AD HOC DISTRIBUTED QUERIES', 1HERCONFIGUREER MET OVERRIDE

Nu wil ik de lijst met klanten in het Verenigd Koninkrijk vullen en deze invoegen in de "Klanten " tafel. Zoals ik al zei, accepteert de functie de landnaam om de records te filteren. Nu moeten we het volgende script uitvoeren op de doelserver (SQL_VM_2 ) om de lijst met klanten in "Verenigd Koninkrijk" in te vullen.

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

De uitvoer ziet er als volgt uit:

Voer nu het volgende script uit op de doelserver (SQL_VM_2 om gegevens die zijn ingevuld door in te voegen in de tabel 'Klanten') ).

INVOEREN IN KLANTEN (CUSTOMER_NAME,PHONEUMBER,EMAILADDRESS,ADDRESS,CITY,COUNTRY,POSTALCODE)SELECT CUSTOMER_NAME, PHOENNUMBER, EMAILADDRESS, ADDRESS, CITY, COUNTRY, POSTALCODE FROM OPENQUERY([TTIVARDE609-CLAREVM]RY VARDE609-CLARE 150)SET @COUNTRY=''VERENIGD KONINKRIJK'' SELECT * FROM [ADVENTUREWORKS2014].DBO.GETCUSTOMERBYCOUNTRY(''''+ @COUNTRY +'''')' )/*Output*/(1913 rijen beïnvloed)

Laten we nu controleren of de gegevens correct zijn ingevoegd. Om dit te controleren, voert u de volgende query uit op de Destination-server (SQL_VM_2).

GEBRUIK DEMODATABASEGOSELECT TOP 20 CUSTOMER_NAME, PHONENUMBER, EMAILADDRESS, ADDRESS, STAD, LAND, POSTCODE VAN KLANTEN

De uitvoer ziet er als volgt uit:

Samenvatting

In dit artikel heb ik behandeld:

  1. Insert Into-statement en het gebruik ervan.
  2. Hoe de uitvoer van de tabelwaardefunctie op te slaan in een SQL-tabel.
  3. Hoe de uitvoer van de tabelwaardefunctie op te slaan in de SQL-tabel op de externe server met behulp van Linked Server.

  1. Lijst met MySQL-specificaties voor datumnotatie

  2. Problemen met transactionele replicatie van SQL Server

  3. Hoe PostgreSQL op een VPS / Dedicated Server te krijgen

  4. MySQL zoeken en tekst in een veld vervangen