sql >> Databasteknik >  >> RDS >> Database

Avancerad SQL:Infoga utdata från den parameteriserade tabellvärderade funktionen i SQL-tabellen

I den här artikeln kommer jag att demonstrera följande:

  1. Hur man infogar utdata från en funktion med tabellvärde i en SQL-tabell.
  2. Hur man infogar utdata från en tabellvärderad funktion som skapas på fjärrdatabasservern.

Vad är "Infoga i"-satsen

I RDBMS är "Infoga i" en av de grundläggande SQL-satserna. Den används för att infoga nya poster i en SQL-tabell. Med hjälp av uttalandet kan vi utföra följande uppgifter:

  • Infoga nya poster i en tabell (Basic Insert).
  • Infoga värden för en specifik kolumn i en tabell.
  • Infoga utdata som genereras av en lagrad procedur i en SQL-tabell.

För att demonstrera ovanstående, låt oss skapa en tabell med namnet "Studenter ” på DemoDatabase. Kör följande kod för att skapa tabellen:

SKAPA TABELLELEVER ( ID INT IDENTITET(1, 1) PRIMÄRNYCKEL, FÖRNAMN VARCHAR(250), EFTERNAMN VARCHAR(250), ADMISSIONSDATUM DATUMTIDEN, BETYGTECKEL(1) )

Utför grundläggande infogning

För att utföra grundläggande infogning måste vi ange namnet på måltabellen och tabellens värden. Följande är en grundläggande syntax för den grundläggande infogningssatsen:

INSERT I -VÄRDEN ( , .. )

Till exempel vill vi infoga förnamn, efternamn och betyg på tre elever i tabellen "Studenter". För att göra det, kör följande kod:

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

Kör "Välj"-frågan mot "Student" för att granska resultaten.

VÄLJ FÖRNAMN, EFTERNAMN, ADMISSIONSDATE, BETYG FRÅN ELEVER

Resultatet är följande:

Infoga värden för en specifik kolumn i tabellen

För att infoga värden i specifika kolumner i en tabell måste du ange namnet på måltabellen och namnet på de kolumner där du vill infoga data. Följande är syntaxen.

INFOGA I  ( KOLUMN 1 , KOLUMN 2 ) VÄRDEN ( , .. )

Till exempel vill vi infoga för- och efternamn på två elever i "Elever ” tabell. För att göra det, kör följande kod:

INSERT I STUDENTER (FÖRNAMN, EFTERNAMN) VÄRDEN ('NIMESH', 'UPADHYAY'), ('RUPESH', 'DATTA')

Kör "Välj"-frågan mot "Elever ” tabell.

VÄLJ FÖRNAMN, EFTERNAMN, ADMISSIONSDATE, BETYG FRÅN ELEVER

Utgången ser ut som följer:

Infoga utdata, generera med en lagrad procedur

För att infoga utdata från en lagrad procedur i tabellen måste vi ange måltabellens namn och den lagrade källan. För att generera utdata från den lagrade proceduren måste vi använda nyckelordet "exec" eller "EXECUTE". Så vi måste ange tabellnamnet eller namnen på kolumnerna följt av nyckelordet "exec". Följande är syntaxen:

INFOGA I  ( KOLUMN 1 , KOLUMN 2 ) EXEC 

Till exempel vill vi infoga resultatet av proceduren som fyller i namnen på de studenter vars antagningsdatum inte är null. För att göra det skapar vi en lagrad procedur som heter "spGet_Student_AdmissionDate ”. För att skapa en lagrad procedur, kör följande kod:

ANVÄND DEMODATABAS GÅ SKAPA PROCEDUR SPGET_STUDENT_ADMISSIONDATE SOM BÖRJA VÄLJ ISNULL(FIRSTNAME, '') + ' ' + ISNULL(EFTERNAMN, '') SOM STUDENTNAMN, ADMISSIONSDATUM, BETYG FRÅN STUDENTER DÄR ANTAGNINGSDATUM INTE ÄR END

När proceduren har skapats kör du proceduren genom att köra följande kod:

EXECUTE spGet_Student_Admissiondate

Utgången ser ut som följer:

Som jag nämnde ovan vill vi infoga utdata från den lagrade proceduren med namnet "spGet_Student_Admissiondate ” i en tillfällig tabell. Kör först följande kod för att skapa tabellen:

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

När tabellen har skapats, kör du följande kod för att infoga utdata från "spGet_Student_Admissiondate ” till “#TempStudents ”.

INSERT INTO #TEMPSTUDENTS EXECUTE SPGET_STUDENT_ADMISSIONDATE Utdata:(3 rader påverkade)

Låt oss nu kontrollera resultatet av "#TEMPSTUDENTS ”. För att göra det, kör följande kod:

Nu, som jag nämnde ovan, ska jag demonstrera hur vi kan infoga en utdata som genereras av en tabellvärderad funktion i en SQL-tabell. Låt oss först förstå vad en tabellvärderad funktion är.

Vad är tabellvärderad funktion

En tabellvärderad funktion är en speciell T-SQL-kod som accepterar parameter/parametrar och baserat på de villkor som definieras i en variabel, returnerar resultatuppsättningen i tabellvariabeln. Följande är fördelarna med att använda den tabellvärderade funktionen:

  1. Det kan köras i Select-frågan.
  2. Den kan användas i flera delar av en fråga, t.ex. i Case-satsen, where/having-satser.
  3. Utdata från en tabellvärderad funktion är en postuppsättning, därför kan du koppla funktionen med tabeller.

Infoga utdata från inline-tabellvärderad funktion i SQL-tabell

I det här avsnittet kommer jag att förklara hur man infogar utdata från en tabellvärderad funktion i en SQL-tabell med T-SQL.

För demonstration använder jag databasen AdventureWorks2014. Jag skapade en inline tabellfunktion med flera värden som heter "GetEmployeesbyHireDate .” Denna funktion fyller i information om anställda, anställda inom ett specifikt datum och tid. Funktionen använder @FormDate och @Toda parametrarna för att filtrera data. Utdata från funktionen kommer att lagras i en SQL-tabell.

Följande kod skapar en funktion:

SKAPA FUNKTION GETTEMPLOYEESBYHIREDATE (@FROMDATE AS DATETIME, @TODATE AS DATETIME) RETURNERAR @EMPLOYEES TABEL ( ANSTÄLLDARNAMN VARCHAR (MAX), FÖDELSEDATUM DATETIME, JOBTITEL VARCHAR(150), EMAILID VARCHAR 100(100), EMAILID VARCHAR(100),(100) DATETIME ) AS BEGIN INSERT INTO @EMPLOYEES SELECT ( ISNULL( B.FIRSTNAME, '') + ' ' + ISNULL( B.MIDDLENAME, '') + ' ' + ISNULL( B.LASTNAME, '') )SOM ANSTÄLLDANNAMN, A .FÖDELSEDATUM, B.JOBBTITEL, B.EMAILADRESS, B.TELEFONNUMMER, A.HIREDATE FRÅN [HUMANRESOURCES].[ANSTÄLLD] A INRE JOIN [HUMANRESOURCES].[ANSTÄLLDA] B PÅ A.BUSINESSENTITYID =B.BUSINESSENTITYIDRE WÅNDARE. @FROMDATE OCH @TODATE RETURN END

Med hjälp av Select-frågan kan vi få utdata från en SQL-funktion. Till exempel vill du fylla i en lista över anställda, rekryterade inom år 2009. Kör följande fråga för att få listan:

DECLARE @FROMDT DATETIME DECLARE @TODT DATETIME SET @FROMDT='2009-01-01' SET @TODT='2009-12-31' VÄLJ * FRÅN GETEMPLOYEESBYHIREDATE(@FROMDT, @TODT)

Utdata från ovanstående fråga ser ut som följer:

Skapa nu en tabell med namnet "tblEmploye e" för att lagra utdata från "GetEmployeesbyHiredate " funktion. Följande kod skapar tabellen med namnet "tblEmployee ”.

SKAPA TABELL TBLE ANSTÄLLDA ( ANSTÄLLDA NAMN VARCHAR (MAX), FÖDELSEDAT DATUMTIDEN, JOBBTITEL VARCHAR(150), E-POST VARCHAR(100), TELEFONNUMMER VARCHAR(20), ANSTÄLLNING DATUMTIDEN )

Som jag nämnde tidigare vill vi fylla i informationen om de anställda, som anställdes 2009. För att göra det, infoga utdata från GetEmployeesbyHireDate funktion i tblEmployees tabell. För att göra det, kör följande kod:

DECLARE @FROMDT DATETIME DECLARE @TODT DATETIME SET @FROMDT='2009-01-01' SET @TODT='2009-12-31' INFO I TBLEMPLOYEES VÄLJ ANSTÄLLDANS NAMN, FÖDELSEDATUM, JOBBTITEL, E-POST DATUMNUMMER, GENERALHIMPLOYED, (@FROMDT, @TODT)

Låt oss verifiera att data har infogats i tabellen. För att göra det, kör följande kod:

VÄLJ * FRÅN TBLE-ANSTÄLLDA

Utgången ser ut som följer:

Infoga data i tabeller från fjärrdatabaser

Ibland kanske du vill extrahera data från servrarna som är lagrade i ett annat datacenter. Detta kan göras med SQL Linked server.

I det här avsnittet kommer jag att förklara hur man infogar utdata från den tabellvärderade funktionen, skapad på fjärrservern. För att demonstrera scenariot är följande inställningar.

[tabell id=57 /]

I demon kommer vi att utföra följande uppgifter:

  1. På källservern (SQL_VM_1 ), skapa en tabellvärderad funktion med namnet "getCustomerByCountry " på "AdventureWorks2014 ” databas för att fylla i data.
  2. På målservern skapar du en länkad server med namnet "Remote_Server ” för att utföra funktionen (getCustomerByCountry ).
  3. Skapa en tabell med namnet Kund på målservern ” för att lagra data, hämtad av fjärrfunktionen (getCustomerByCountry ).

Följande bild illustrerar inställningen.

Uppgiften som ska utföras på en källserver:

På källservern (SQL_VM_1 ), skapa en funktion som heter "getCustomerByCountry .” Den fyller i information om en kund som finns i ett specifikt land eller region. Funktionen använder @CountryName parameter för att filtrera data. Kör följande kod för att skapa funktionen.

Ändra FUNKTION Getcustomerbycountry(@CountryName VARCHAR)returs @Customers TABLE ( kundnamn VARCHAR(500), phoennumber VARCHAR(50), e-postadress VARCHAR(100), adress VARCHAR(max), stad VARCHAR(150(250), land VARCH ), postnummer VARCHAR(50))SOM BÖRJAN INSERT INTO @Customers VÄLJ kundnamn, telefonnummer, e-postadress, adress, stad, land, postnummer FRÅN kunder WHERE country [email protected] RETURN END

De uppgifter som ska utföras på destinationsservern:

För att fylla i data från källservern (SQL_VM_1 ), skapa först en länkad server mellan källan (SQL_VM_1 ) och destination (SQL_VM_ 2). Kör följande kod på målservern (SQL_VM_2 ) för att skapa en länkad server.

ANVÄND [MASTER]GOEXEC MASTER.DBO.SP_ADDLINKEDSERVER @SERVER =N'SQL_VM_1', @SRVPRODUCT=N'SQL SERVER'GOEXEC MASTER.DBO.SP_ADDLINKEDSRVLOGIN @RMTSRVNAME=N' Remote_Server',@N'FESELSEF=',@USESELSEF=,@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'ANVÄND FJÄRRSAMLING', @OPTVALUE=N'TRUE'GOEXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'Remote_Server', @OPTNAME=N'REMOTE PROC TRANSACTION PROMOTION', @OPTVALUE=N'FALSE'GO

När den länkade servern har skapats skapar du en SQL-tabell för att lagra information om kunder och fyller i den genom att köra SQL-funktionen, skapad på källservern (SQL_VM_1 ).

Kör följande kod för att skapa en tabell.

ANVÄND DEMODATABASEGOSKAPA TABELLKUNDER ( ID INT IDENTITY(1, 1), CUSTOMER_NAME VARCHAR(500), TELEFONNUMMER VARCHAR(50), E-MAILADRESS VARCHAR(100), ADDRESS VARCHAR(MAX), CITY VARCHARRY(COUNT VARCHAR(150) 250), POSTALCOD VARCHAR(50) )

Med hjälp av en länkad server kan vi köra den tabellvärderade funktionen som skapats på en fjärrdatabasserver. När du försöker köra funktionen med länkad server, uppstår följande fel:

Msg 4122, Level 16, State 1, Line 28Fjärrtabellvärdade funktionsanrop är inte tillåtna.

För att utföra någon funktion på fjärrservern måste vi därför använda nyckelordet OPENQUERY. Den används för att initiera den ad hoc-distribuerade frågan med hjälp av en länkad server. Se den här artikeln för att förstå konceptet med OPENQUERY.

För att använda OPENQUERY måste vi aktivera avancerad konfigurationsparameter med namnet "Ad Hoc Distributed Queries ” på käll- och målservrarna. Kör följande kod för att aktivera den.

ANVÄND MASTERGOEXEC SP_CONFIGURE 'VISA AVANCERAT ALTERNATIV', 1REKONFIGURERA MED OVERRIDEEXEC SP_CONFIGURE 'AD HOC DISTRIBUTERADE FRÅGOR', 1RECONFIGURE WITH OVERRIDE

Nu vill jag fylla i listan över kunder som finns i Storbritannien och infoga dem i "Kunder ” tabell. Som jag nämnde accepterar funktionen landsnamn för att filtrera posterna. Nu måste vi köra följande skript på destinationsservern (SQL_VM_2 ) för att fylla i listan över kunder som finns i "Storbritannien".

VÄLJ CUSTOMER_NAME, PHOENNUMBER, EMAILADDRESS, ADDRESS, CITY, COUNTRY, POSTALCODE FRÅN OPENQUERY([TTI609-VM2], 'DECLARE @COUNTRY VARCHAR(150)SET @COUNTRY=''Storbritannien'' VÄLJ * FRÅN [ADVENTURS2014] .DBO.GETCUSTOMERBYCOUNTRY(''''+ @COUNTRY +'''')' )

Utgången ser ut som följer:

Nu, för att infoga data som fylls av i "Kunder"-tabellen, kör följande skript på destinationsservern (SQL_VM_2 ).

INSERT I KUNDER (CUSTOMER_NAME,PHONENUMBER,EMAILADDRESS,ADDRESS,CITY,COUNTRY,POSTALCODE)VÄLJ CUSTOMER_NAME, PHOENNUMBER, EMAILADDRESS, ADDRESS, CITY, COUNTRY, POSTALCOD FRÅN OPENQUERY([TTI609-DECLARCHARM2], 150)SET @COUNTRY=''STORBRITANNIEN'' VÄLJ * FRÅN [ADVENTUREWORKS2014].DBO.GETCUSTOMERBYCOUNTRY(''''+ @COUNTRY +'''')' )/*Utdata*/(1913 rader påverkade) 

Låt oss nu verifiera om data har infogats korrekt. För att kontrollera, kör följande fråga på målservern (SQL_VM_2).

ANVÄND DEMODATABASEGOSELECT TOP 20 CUSTOMER_NAME, PHONENUMBER, EMAILADDRESS, ADDRESS, CITY, COUNTRY, POSTALCODE FRÅN KUNDER

Utgången ser ut som följer:

Sammanfattning

I den här artikeln har jag täckt:

  1. “Infoga i”-satsen och dess användning.
  2. Hur man sparar utdata från den tabellvärdade funktionen i en SQL-tabell.
  3. Så här sparar du utdata från den tabellvärderade funktionen i SQL-tabellen som finns på fjärrservern med länkad server.

  1. Synkronisera databasstruktur mellan applikationer

  2. Hur fyller man i den andra rullgardinsmenyn baserat på valet av den första rullgardinsmenyn med jQuery/AJAX och PHP/MySQL?

  3. Oracle snabbare sökfråga

  4. VALUES-sats i SQL Server