sql >> Database teknologi >  >> RDS >> Database

Avanceret SQL:Indsæt output fra den parametriserede tabelværdi-funktion i SQL-tabel

I denne artikel vil jeg demonstrere følgende:

  1. Sådan indsætter du output fra en funktion med tabelværdi i en SQL-tabel.
  2. Sådan indsætter man output fra en funktion med tabelværdi, som er oprettet på den eksterne databaseserver.

Hvad er "Indsæt i"-erklæring

I RDBMS er "Indsæt i" en af ​​de grundlæggende SQL-sætninger. Det bruges til at indsætte nye poster i en SQL-tabel. Ved at bruge erklæringen kan vi udføre følgende opgaver:

  • Indsæt nye poster i en tabel (Basic Insert).
  • Indsæt værdier for en specifik kolonne i en tabel.
  • Indsæt output genereret af en lagret procedure i en SQL-tabel.

For at demonstrere ovenstående, lad os oprette en tabel med navnet "Studenter ” på DemoDatabase. Udfør følgende kode for at oprette tabellen:

OPRET TABELSTUDENTER (ID INT IDENTITET(1, 1) PRIMÆR NØGLE, FORNAVN VARCHAR(250), EFTERNAVN VARCHAR(250), ADMINISTRATIONSDATO DATETIME, GRADE CHAR(1) )

Udfør grundlæggende indsættelse

For at udføre grundlæggende indsættelse skal vi angive navnet på måltabellen og tabellens værdier. Det følgende er en grundlæggende syntaks for den grundlæggende insert-sætning:

INSERT INTO -VÆRDIER ( , .. )

For eksempel ønsker vi at indsætte fornavn, efternavn og karakter på tre elever i "Elever"-tabellen. For at gøre det skal du udføre følgende kode:

INDSÆT I STUDENTS VÆRDI ('NISARG', 'UPADHYAY', '2018-09-11', 'A'), ('RAGHAV', 'DATTA', '2017-10-01', 'A') , ('KIRAN', 'AMIN', '2016-01-31', 'A')

Udfør "Vælg"-forespørgslen mod "Student" for at gennemgå resultaterne.

VÆLG FORNAVN, EFTERNAVN, OPTAGELSESDATO, KARAKTER FRA STUDENTER

Resultatet er som følger:

Indsæt værdier for en specifik kolonne i tabellen

For at indsætte værdier i specifikke kolonner i en tabel skal du angive navnet på måltabellen og navnet på de kolonner, hvor du vil indsætte data. Det følgende er syntaksen.

INDSÆT I  ( KOLONNE 1 , KOLONNE 2 ) VÆRDIER ( , .. )

For eksempel vil vi indsætte fornavn og efternavn på to elever i "Studenter " bord. For at gøre det skal du udføre følgende kode:

INDSÆT VÆRDI I STUDENTER (FORNAVN, EFTERNAVN ('NIMESH', 'UPADHYAY'), ('RUPESH', 'DATTA')

Udfør "Vælg"-forespørgslen mod "Studenter ” tabel.

VÆLG FORNAVN, EFTERNAVN, OPTAGELSESDATO, KARAKTER FRA STUDENTER

Outputtet ser ud som følger:

Indsæt output, generer ved en lagret procedure

For at indsætte output fra en lagret procedure i tabellen skal vi angive måltabelnavnet og kildens lagrede procedure. For at generere output fra den lagrede procedure skal vi bruge nøgleordet "exec" eller "EXECUTE". Så vi skal angive tabelnavnet eller navnene på kolonnerne efterfulgt af nøgleordet "exec". Følgende er syntaksen:

INDSÆT I  ( KOLONNE 1 , KOLONNE 2 ) EXEC 

For eksempel ønsker vi at indsætte output fra proceduren, som udfylder navnene på de studerende, hvis optagelsesdato ikke er nul. For at gøre det vil vi oprette en lagret procedure med navnet "spGet_Student_AdmissionDate ”. For at oprette en lagret procedure skal du udføre følgende kode:

BRUG DEMODATABASE GÅ OPRET PROCEDURE SPGET_STUDENT_ADMISSIONDATE SOM BEGIN SELECT ISNULL(FIRSTNAME, '') + ' ' + ISNULL(Efternavn, '') SOM STUDENTNAVN, OPTAGELSESDATO, KARAKTER FRA STUDENTER, HVOR OPTAGELSESDATO IKKE ER

Når proceduren er oprettet, skal du køre proceduren ved at udføre følgende kode:

UDFØR spGet_Student_Admissiondate

Outputtet ser ud som følger:

Som jeg nævnte ovenfor, ønsker vi at indsætte output fra den lagrede procedure med navnet "spGet_Student_Admissiondate ” i en midlertidig tabel. Først skal du udføre følgende kode for at oprette tabellen:

 ( ID INT IDENTITY(1, 1), STUDENTNAVN VARCHAR(250), ADMINISTRATIONSDATO DATETIME, GRADE CHAR(1) )

Når tabellen er oprettet, skal du udføre følgende kode for at indsætte outputtet af "spGet_Student_Admissiondate ” til “#TempStudents ”.

INSERT INTO #TEMPSTUDENTS EXECUTE SPGET_STUDENT_ADMISSIONDATE Output:(3 rækker påvirket)

Lad os nu tjekke outputtet af "#TEMPSTUDENTS ”. For at gøre det skal du udføre følgende kode:

Nu, som jeg nævnte ovenfor, skal jeg demonstrere, hvordan vi kan indsætte et output, der er genereret af en tabelværdi-funktion i en SQL-tabel. Lad os først forstå, hvad der er en funktion med tabelværdi.

Hvad er tabelværdi-funktion

En funktion med tabelværdi er en speciel T-SQL-kode, der accepterer parameter/parametre og baseret på de betingelser, der er defineret i en variabel, returnerer resultatsættet i tabelvariablen. Følgende er fordelene ved at bruge den tabelværdisatte funktion:

  1. Det kan udføres i Select-forespørgslen.
  2. Den kan bruges i flere dele af en forespørgsel, f.eks. i sagserklæringen, hvor/har klausuler.
  3. Outputtet fra en funktion med tabelværdi er et postsæt, så du kan forbinde funktionen med tabeller.

Indsæt output af inline tabel-værdi-funktion i SQL-tabel

I dette afsnit skal jeg forklare, hvordan man indsætter output fra en tabelværdi-funktion i en SQL-tabel ved hjælp af T-SQL.

Til demonstration bruger jeg AdventureWorks2014-databasen. Jeg oprettede en indlejret tabelfunktion med flere værdier ved navn "Get EmployeesbyHireDate ." Denne funktion udfylder oplysninger om medarbejdere, der er ansat inden for en bestemt dato og tid. Funktionen bruger @FormDate og @Toda te parametre til at filtrere dataene. Outputtet af funktionen vil blive gemt i en SQL-tabel.

Følgende kode opretter en funktion:

OPRET FUNKTION GETTEMPLOYEESBYHIREDATE (@FROMDATE AS DATETIME, @TODATE AS DATETIME) RETURNERER @EMPLOYEES TABEL (EMPLOYEENAME VARCHAR (MAX), FØDSELSDATO DATETIME, JOBTITLE VARCHAR(150), EMAILID VARCHAR(100), EMAILID VARCHAR(100),(100) DATETIME ) AS BEGIN INSERT INTO @EMPLOYEES SELECT ( ISNULL( B.FIRSTNAME, '') + ' ' + ISNULL( B.MIDDLENAME, '') + ' ' + ISNULL( B.EFTERNAVN, '') )SOM MEDARBEJDERNAVN, A .FØDSELSDATO, B.JOBTITLE, B.EMAILADRESSE, B.TELEFONNUMMER, A.UDLEJNING FRA [MENNESKERE].[Medarbejder] EN INDRE JOIN [HUMANRESOURCES].[Medarbejder] B PÅ A.BUSINESSENTITYID =B.BUSINESSENTITYIDRE WODEN. @FROMDATE OG @TODATE RETURN END

Ved at bruge Select-forespørgslen kan vi få output fra en SQL-funktion. For eksempel vil du udfylde en liste over medarbejdere, der er rekrutteret inden for år 2009. Udfør følgende forespørgsel for at få listen:

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

Outputtet af ovenstående forespørgsel ser ud som følger:

Opret nu en tabel med navnet "tblEmploye e" for at gemme outputtet af "Get EmployeesbyHiredate " funktion. Følgende kode opretter tabellen med navnet "tblEmployee ”.

OPRET TABEL TBLE MEDARBEJDERE ( MEDARBEJDERNAVN VARCHAR (MAX), FØDSELSDATO DATETIME, JOBTITLE VARCHAR(150), EMAILID VARCHAR(100), TELEFONNUMMER VARCHAR(20), LEJEDATO DATETIME )

Som jeg nævnte tidligere, ønsker vi at udfylde oplysningerne om de ansatte, som blev ansat i 2009. For at gøre det skal du indsætte output fra GetEmployeesbyHireDate funktion i tblEmployees bord. For at gøre det skal du udføre følgende kode:

ERKLÆR @FROMDT DATETIME DECLARE @TODT DATETIME SET @FROMDT='2009-01-01' SET @TODT='2009-12-31' INDSÆT I TBLEMPLOYEES VÆLG MEDARBEJDERNAVN, FØDSELSDATO, JOBTITLE, EMAILDATEROM BYHIREPHEES, GENERELLE (@FROMDT, @TODT)

Lad os kontrollere, at data er blevet indsat i tabellen. For at gøre det skal du udføre følgende kode:

VÆLG * FRA MEDARBEJDERE

Outputtet ser ud som følger:

Indsæt data i tabeller fra fjerndatabaser

Nogle gange vil du måske udtrække data fra serverne, der er gemt i et andet datacenter. Dette kan gøres ved hjælp af SQL Linked server.

I dette afsnit vil jeg forklare, hvordan man indsætter output fra den tabelværdisatte funktion, oprettet på fjernserveren. For nu at demonstrere scenariet er følgende opsætning.

[tabel id=57 /]

I demoen udfører vi følgende opgaver:

  1. På kildeserveren (SQL_VM_1 ), opret en funktion med en tabelværdi med navnet "getCustomerByCountry ” på “AdventureWorks2014 ” database for at udfylde dataene.
  2. På destinationsserveren skal du oprette en linket server med navnet "Remote_Server ” for at udføre funktionen (getCustomerByCountry ).
  3. På destinationsserveren skal du oprette en tabel med navnet "Kunde ” for at gemme data, hentet af fjernfunktionen (getCustomerByCountry ).

Følgende billede illustrerer opsætningen.

Opgaven, der skal udføres på en kildeserver:

På kildeserveren (SQL_VM_1 ), opret en funktion ved navn "getCustomerByCountry ." Den udfylder oplysninger om en kunde i et bestemt land eller område. Funktionen bruger @CountryName parameter for at filtrere dataene. Udfør følgende kode for at oprette funktionen.

Ændre FUNKTION Getcustomerbycountry(@CountryName VARCHAR)returner @Customers TABLE ( kundenavn VARCHAR(500), phoennumber VARCHAR(50), e-mailadresse VARCHAR(100), adresse VARCHAR(max), by VARCHAR(150(250), land VARCH ), postnummer VARCHAR(50))AS BEGIN INSERT INTO @Customers VÆLG kunde_navn, phoennumber, emailadresse, adresse, by, country, postalcode FRA kunder HVOR land [email protected] RETURN END

De opgaver, der skal udføres på destinationsserveren:

For at udfylde data fra kildeserveren (SQL_VM_1 ), skal du først oprette en linket server mellem kilden (SQL_VM_1 ) og destination (SQL_VM_ 2). Udfør følgende kode på destinationsserveren (SQL_VM_2 ) for at oprette en forbundet server.

BRUG [MASTER]GOEXEC MASTER.DBO.SP_ADDLINKEDSERVER @SERVER =N'SQL_VM_1', @SRVPRODUCT=N'SQL SERVER'GOEXEC MASTER.DBO.SP_ADDLINKEDSRVLOGIN @RMTSRVNAME=N' Remote_Server',@USESALSEF=',@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'DATAADGANG', @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'BRUG REMOTE COLLATION', @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 sammenkædede server er oprettet, skal du oprette en SQL-tabel til at gemme oplysninger om kunder og udfylde den ved at udføre SQL-funktionen, der er oprettet på kildeserveren (SQL_VM_1 ).

Udfør følgende kode for at oprette en tabel.

BRUG DEMODATABASEGOCREATE TABLE KUNDER ( ID INT IDENTITY(1, 1), CUSTOMER_NAME VARCHAR(500), TELEFONNUMMER VARCHAR(50), EMAILADRESSE VARCHAR(100), ADRESSE VARCHAR(MAX), CITY VARCHARRY(COUNT VARCHAR(150) 250), POSTALCODE VARCHAR(50) )

Ved at bruge en sammenkædet server kan vi udføre den tabelværdisatte funktion, der er oprettet på en ekstern databaseserver. Når du forsøger at udføre funktionen ved hjælp af linket server, opstår følgende fejl:

Besked 4122, niveau 16, tilstand 1, linje 28 Fjernfunktionsopkald med tabelværdier er ikke tilladt.

Derfor skal vi bruge OPENQUERY nøgleordet for at udføre enhver funktion på fjernserveren. Den bruges til at initialisere den ad hoc-distribuerede forespørgsel ved hjælp af en forbundet server. Se denne artikel for at forstå begrebet OPENQUERY.

For at bruge OPENQUERY skal vi aktivere avanceret konfigurationsparameter med navnet "Ad Hoc Distributed Queries ” på kilde- og destinationsserverne. Udfør følgende kode for at aktivere den.

BRUG MASTERGOEXEC SP_CONFIGURE 'VIS AVANCERET VALGMULIGHED', 1REKONFIGURER MED OVERRIDEEXEC SP_CONFIGURE 'AD HOC DISTRIBUTEREDE FORESPØRGSEL', 1GENKONFIGURER MED TILSIDE

Nu vil jeg udfylde listen over kunder, der er placeret i Det Forenede Kongerige og indsætte dem i "Kunder " bord. Som jeg nævnte, accepterer funktionen landenavn for at filtrere posterne. Nu skal vi udføre følgende script på destinationsserveren (SQL_VM_2 ) for at udfylde listen over kunder i "Storbritannien".

VÆLG CUSTOMER_NAME, PHOENNUMBER, EMAILADDRESS, ADDRESS, CITY, COUNTRY, POSTALCODE FROM OPENQUERY([TTI609-VM2], 'DECLARE @COUNTRY VARCHAR(150)SET @COUNTRY=''Storbritannien'' VÆLG * FRA [ADVENTURS2014] .DBO.GETCUSTOMERBYCOUNTRY(''''+ @COUNTRY +'''')' )

Outputtet ser ud som følger:

Nu, for at indsætte data udfyldt af i "Kunder"-tabellen, skal du udføre følgende script på destinationsserveren (SQL_VM_2 ).

INDSÆT I KUNDER (CUSTOMER_NAME,PHONENUMBER,EMAILADDRESS,ADDRESS,CITY,COUNTRY,POSTALCODE)VÆLG CUSTOMER_NAME, PHOENNUMBER, EMAILADDRESS, ADDRESS, BY, COUNTRY, POSTALCODE FROM OPENQUERY([TTI609-DECLARCHARM2], 150)SET @COUNTRY=''Storbritannien'' VÆLG * FRA [ADVENTUREWORKS2014].DBO.GETCUSTOMERBYCOUNTRY(''''+ @COUNTRY +'''')' )/*Output*/(1913 rækker påvirket) 

Lad os nu kontrollere, om data er blevet indsat korrekt. For at kontrollere skal du udføre følgende forespørgsel på destinationsserveren (SQL_VM_2).

BRUG DEMODATABASEGOSELECT TOP 20 CUSTOMER_NAME, TELEFONNUMMER, EMAILADRESSE, ADRESSE, BY, LAND, POSTALCODE FRA KUNDER

Outputtet ser ud som følger:

Oversigt

I denne artikel har jeg dækket:

  1. "Indsæt i"-erklæring og dens brug.
  2. Sådan gemmer du outputtet af den tabelværdisatte funktion i en SQL-tabel.
  3. Sådan gemmer du outputtet fra den tabelværdisatte funktion til SQL-tabellen, der er placeret på en ekstern server ved hjælp af Linked Server.

  1. Bedste måde at slette millioner af rækker efter ID

  2. Vælg første række i hver GRUPPE FOR gruppe?

  3. Oracle JDBC:ugyldigt brugernavn/adgangskode (ora-01017)

  4. Sådan konverteres en dato/tidsværdi til en streng i SQL Server ved hjælp af CONVERT()