sql >> Databáze >  >> RDS >> Database

Rozšířené SQL:Vložení výstupu parametrizované funkce s hodnotou tabulky do tabulky SQL

V tomto článku předvedu následující:

  1. Jak vložit výstup funkce s hodnotou tabulky do tabulky SQL.
  2. Jak vložit výstup funkce s tabulkovou hodnotou, která je vytvořena na vzdáleném databázovém serveru.

Co je příkaz „Vložit do“

V RDBMS je „Vložit do“ jedním ze základních příkazů SQL. Slouží k vkládání nových záznamů do SQL tabulky. Pomocí příkazu můžeme provádět následující úkoly:

  • Vložit nové záznamy do tabulky (základní vložení).
  • Vložte hodnoty konkrétního sloupce do tabulky.
  • Vložte výstup generovaný uloženou procedurou do tabulky SQL.

Abychom demonstrovali výše uvedené, vytvořte tabulku s názvem „Studenti “ na DemoDatabázi. Pro vytvoření tabulky spusťte následující kód:

VYTVOŘTE STUDENTY TABULKY ( ID INT IDENTITY(1, 1) PRIMÁRNÍ KLÍČ, KŘESTNÍ JMÉNO VARCHAR(250), PŘÍJMENÍ VARCHAR(250), DATUM PŘIJETÍ, ZNAK HODNOTY (1) )

Proveďte základní vložení

Pro provedení základního vložení potřebujeme zadat název cílové tabulky a hodnoty tabulky. Následuje základní syntaxe základního příkazu insert:

INSERT INTO  VALUES ( , .. )

Například chceme vložit jméno, příjmení a ročník tří studentů do tabulky „Studenti“. Chcete-li to provést, spusťte následující kód:

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

Proveďte dotaz „Vybrat“ proti „Student“ a zkontrolujte výsledky.

VYBERTE JMÉNO, PŘÍJMENÍ, DATUM PŘIJETÍ, TŘÍDU OD STUDENTŮ

Výsledek je následující:

Vložit hodnoty konkrétního sloupce do tabulky

Chcete-li vložit hodnoty do konkrétních sloupců tabulky, musíte zadat název cílové tabulky a názvy sloupců, do kterých chcete vložit data. Následuje syntaxe.

VLOŽTE DO  ( SLOUPEK 1 , SLOUPEK 2 ) HODNOTY ( , .. )

Například chceme vložit jméno a příjmení dvou studentů do pole „Studenti " stůl. Chcete-li to provést, spusťte následující kód:

VLOŽTE HODNOTY DO STUDENTŮ (JMÉNO, PŘÍJMENÍ) ('NIMESH', 'UPADHYAY'), ('RUPESH', 'DATTA')

Proveďte dotaz „Vybrat“ proti „Studentům ” tabulka.

VYBERTE JMÉNO, PŘÍJMENÍ, DATUM PŘIJETÍ, TŘÍDU OD STUDENTŮ

Výstup vypadá následovně:

Vložte výstup vygenerovaný uloženou procedurou

Abychom vložili výstup uložené procedury do tabulky, musíme zadat název cílové tabulky a zdrojovou uloženou proceduru. Abychom vygenerovali výstup uložené procedury, musíme použít klíčové slovo „exec“ nebo „EXECUTE“. Potřebujeme tedy zadat název tabulky nebo názvy sloupců následovaný klíčovým slovem „exec“. Následuje syntaxe:

INSERT INTO  ( SLOUPEK 1 , SLOUPEK 2 ) EXEC 

Chceme například vložit výstup procedury, který vyplní jména studentů, jejichž datum přijetí není nulové. Za tímto účelem vytvoříme uloženou proceduru s názvem „spGet_Student_AdmissionDate “. Chcete-li vytvořit uloženou proceduru, spusťte následující kód:

POUŽÍVEJTE DEMODATABÁZI GO CREATE PROCEDURE SPGET_STUDENT_ADMISSIONDATE AS BEGIN SELECT ISNULL(FIRSTNAME, '') + ' ' + ISNULL(PRESSNAME, '') JAKO JMÉNO STUDENTA, DATUM PŘIJETÍ, HODNOTA OD STUDENTŮ, KDE SE NENÍ DATUM PŘIJETÍ 

Jakmile je procedura vytvořena, spusťte ji spuštěním následujícího kódu:

EXECUTE spGet_Student_Admissiondate

Výstup vypadá následovně:

Jak jsem uvedl výše, chceme vložit výstup uložené procedury s názvem „spGet_Student_Admissiondate “ v dočasné tabulce. Nejprve spusťte následující kód pro vytvoření tabulky:

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

Po vytvoření tabulky spusťte následující kód a vložte výstup „spGet_Student_Admissiondate “ na „#TempStudents “.

INSERT INTO #TEMPSTUDENTS EXECUTE SPGET_STUDENT_ADMISSIONDATE Výstup:(ovlivněny 3 řádky)

Nyní zkontrolujeme výstup „#TEMPSTUDENTS “. Chcete-li to provést, spusťte následující kód:

Nyní, jak jsem uvedl výše, ukážu, jak můžeme vložit výstup generovaný funkcí s hodnotou tabulky do tabulky SQL. Nejprve si ujasněme, co je funkce s tabulkovou hodnotou.

Co je funkce s hodnotou tabulky

Tabulková funkce je speciální kód T-SQL, který přijímá parametr/parametry a na základě podmínek definovaných v proměnné vrací sadu výsledků v proměnné tabulka. Níže jsou uvedeny výhody použití funkce s hodnotou tabulky:

  1. Lze jej spustit v rámci výběrového dotazu.
  2. Lze jej použít ve více částech dotazu, např. v příkazu Case, kde/mají klauzule.
  3. Výstupem funkce s hodnotou tabulky je sada záznamů, takže funkci můžete spojit s tabulkami.

Vložit výstup funkce vložené tabulky s hodnotou v tabulce SQL

V této části vysvětlím, jak vložit výstup funkce s hodnotou tabulky do tabulky SQL pomocí T-SQL.

Pro demonstraci používám databázi AdventureWorks2014. Vytvořil jsem inline tabulkovou funkci s více hodnotami s názvem „GetEmployeesbyHireDate .“ Tato funkce vyplní informace o zaměstnancích přijatých v určité datum a čas. Funkce používá @FormDate a @Toda parametry pro filtrování dat. Výstup funkce bude uložen v tabulce SQL.

Následující kód vytvoří funkci:

CREATE FUNCTION GETEMPLOYEESBYHIREDATE (@FROMDATE AS DATETIME, @TODATE AS DATETIME) VRÁTÍ @EMPLOYEES TABLE ( JMÉNO ZAMĚSTNANCE VARCHAR (MAX). A .DATUM NAROZENÍ, B. JOBTITLE, B.EMAILADDRESS, B.PHONENUMBER, A.HIREDATE OD [LIDSKÁ ZDROJE].[ZAMĚSTNANEC] VNITŘNÍ PŘIPOJENÍ K [LIDSKÉ ZDROJE].[ZAMĚSTNANEC] B DNE A.BUSINESSENTITYID =B.BUSINESSENTITYID KDE BLÍŽÍ A.WEENH @FROMDATE AND @TODATE RETURN END

Pomocí výběrového dotazu můžeme získat výstup funkce SQL. Chcete například vyplnit seznam zaměstnanců přijatých v roce 2009. Seznam získáte provedením následujícího dotazu:

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

Výstup výše uvedeného dotazu vypadá následovně:

Nyní vytvořte tabulku s názvem „tblEmploye e“ k uložení výstupu „GetEmployeesbyHiredate funkce “. Následující kód vytvoří tabulku s názvem „tblEmployee “.

VYTVOŘTE TABULKU TBLEMPLOYEES ( EMPLOYEENAME VARCHAR (MAX), DATUM NAROZENÍ DATETIME, JOBTITLE VARCHAR(150), EMAILID VARCHAR(100), PHONENUMBER VARCHAR(20), HIREDATE DATETIME )

Jak jsem již uvedl dříve, chceme vyplnit informace o zaměstnancích, kteří byli přijati v roce 2009. Chcete-li to provést, vložte výstup GetEmployeesbyHireDate funkce v tblEmployees stůl. Chcete-li to provést, spusťte následující kód:

DECLARE @FROMDT DATETIME DECLARE @TODT DATETIME SET @FROMDT='2009-01-01' SET @TODT='2009-12-31' INSERT INTO TBLEMPLOYEES VYBERTE JMÉNO ZAMĚSTNANCE, DATUM NAROZENÍ, JOBTITLE, E-MAIL, DATUM TELEFONNÍHO TEL. (@FROMDT, @TODT)

Ověříme, že data byla vložena do tabulky. Chcete-li to provést, spusťte následující kód:

VYBRAT * Z TBLEMPLOYEES

Výstup vypadá následovně:

Vkládání dat do tabulek ze vzdálených databází

Někdy můžete chtít extrahovat data ze serverů uložených v jiném datovém centru. To lze provést pomocí serveru SQL Linked.

V této části vysvětlím, jak vložit výstup funkce s hodnotou tabulky vytvořené na vzdáleném serveru. Nyní pro demonstraci scénáře je následující nastavení.

[id tabulky=57 /]

V ukázce provedeme následující úkoly:

  1. Na zdrojovém serveru (SQL_VM_1 ), vytvořte tabulkovou funkci s názvem „getCustomerByCountry “ na „AdventureWorks2014 ” databáze k naplnění dat.
  2. Na cílovém serveru vytvořte propojený server s názvem „Remote_Server ” pro provedení funkce (getCustomerByCountry ).
  3. Na cílovém serveru vytvořte tabulku s názvem „Zákazník ” k ukládání dat načtených vzdálenou funkcí (getCustomerByCountry ).

Následující obrázek ilustruje nastavení.

Úloha, která má být provedena na zdrojovém serveru:

Na zdrojovém serveru (SQL_VM_1 ), vytvořte funkci s názvem „getCustomerByCountry .“ Vyplní podrobnosti o zákazníkovi, který se nachází v konkrétní zemi nebo regionu. Funkce používá @CountryName parametr pro filtrování dat. Pro vytvoření funkce spusťte následující kód.

Změnit FUNKCI Getcustomerbycountry(@CountryName VARCHAR)vrací @Customers TABLE (jméno zákazníka VARCHAR(500), telefonní číslo VARCHAR(50), e-mailová adresa VARCHAR(100), adresa VARCHAR(max), město VARCHAR(150), země VARCHAR ), PSČ VARCHAR(50)) JAKO ZAČÁTEK INSERT INTO @Customers VYBERTE jméno_zákazníka, telefonní číslo, e-mailovou adresu, adresu, město, zemi, PSČ FROM customers WHERE country [email protected] NÁVRAT KONEC

Úlohy, které mají být provedeny na cílovém serveru:

Chcete-li naplnit data ze zdrojového serveru (SQL_VM_1 ), nejprve vytvořte propojený server mezi zdrojem (SQL_VM_1 ) a cíl (SQL_VM_ 2). Na cílovém serveru spusťte následující kód (SQL_VM_2 ) pro vytvoření propojeného serveru.

POUŽÍVEJTE [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 TRANSACTION PROMOTION', @OPTVALUE=N'FALSE'GO

Po vytvoření propojeného serveru vytvořte tabulku SQL pro ukládání informací o zákaznících a naplňte ji spuštěním funkce SQL vytvořené na zdrojovém serveru (SQL_VM_1 ).

Spuštěním následujícího kódu vytvořte tabulku.

POUŽÍVEJTE DEMODATABASEGOCREATE TABLE CUSTOMES (ID INT IDENTITY(1, 1), CUSTOMER_NAME VARCHAR(500), PHONENUMBER VARCHAR(50), EMAILADDRESS VARCHAR(100), ADDRESS VARCHAR(MAX), CITY VARCHAR(150), COUNT 250), POSTALCODE VARCHAR(50) )

Pomocí propojeného serveru můžeme spustit funkci s tabulkovou hodnotou vytvořenou na vzdáleném databázovém serveru. Při pokusu o spuštění funkce pomocí propojeného serveru dojde k následující chybě:

Zpráva 4122, úroveň 16, stav 1, řádek 28Vzdálená volání funkcí tabulky nejsou povolena.

K provedení jakékoli funkce na vzdáleném serveru tedy musíme použít klíčové slovo OPENQUERY. Používá se k inicializaci ad hoc distribuovaného dotazu pomocí propojeného serveru. Přečtěte si tento článek, abyste porozuměli konceptu OPENQUERY.

Chcete-li použít OPENQUERY, musíme povolit parametr pokročilé konfigurace s názvem „Ad Hoc Distributed Queries “ na zdrojovém a cílovém serveru. Chcete-li to povolit, spusťte následující kód.

POUŽÍVEJTE MASTERGOEXEC SP_CONFIGURE 'ZOBRAZIT POKROČILOU MOŽNOST', 1ZNOVU KONFIGUROVAT S OVERRIDEEXEC SP_CONFIGURE 'AD HOC DISTRIBUTED QUERIES', 1ZNOVU KONFIGUROVAT S PŘEPISEM

Nyní chci vyplnit seznam zákazníků nacházející se ve Spojeném království a vložit je do „Zákazníci " stůl. Jak jsem již zmínil, funkce přijímá název země pro filtrování záznamů. Nyní musíme na cílovém serveru spustit následující skript (SQL_VM_2 ) k naplnění seznamu zákazníků ve Spojeném království.

SELECT CUSTOMER_NAME, PHOENNUMBER, EMAIL ADDRESS, ADDRESS, CITY, COUNTRY, POSTALCODE FROM OPENQUERY([TTI609-VM2], 'DECLARE @COUNTRY VARCHAR(150)SET @COUNTRY=''VELKÁ KRÁLOVSTVÍ'' SELECT *WORKS 20 [ADVENTURE] .DBO.GETCUSTOMERBYCOUNTRY(''''+ @COUNTRY +'''')' )

Výstup vypadá následovně:

Chcete-li nyní vložit data vyplněná do tabulky „Zákazníci“, spusťte na cílovém serveru následující skript (SQL_VM_2 ).

VLOŽTE DO ZÁKAZNÍKŮ (CUSTOMER_NAME,PHONENUMBER,EMAILADDRESS,ADDRESS,CITY,COUNTRY,POSTALCODE)SELECT CUSTOMER_NAME, PHOENNUMBER, EMAILADDRESS, ADDRESS, CITY, COUNTRY, POSTALCODE FROM OPENQUERY([TTI6CHAR](COUNTRY'VDEMARE2) 150)SET @COUNTRY=''SPOJENÉ KRÁLOVSTVÍ'' VYBRAT * Z [ADVENTUREWORKS2014].DBO.GETCUSTOMERBYCOUNTRY(''''+ @COUNTRY +'''')' )/*Výstup*/(1913 ovlivněných řádků) 

Nyní ověřte, zda byla data vložena správně. Pro kontrolu spusťte následující dotaz na cílovém serveru (SQL_VM_2).

POUŽÍVEJTE DEMODATABASEGOSELECT TOP 20 CUSTOMER_NAME, PHONENUMBER, EMAILADDRESS, ADDRESS, CITY, COUNTRY, POSTAL CODE OD ZÁKAZNÍKŮ

Výstup vypadá následovně:

Shrnutí

V tomto článku jsem se zabýval:

  1. Příkaz „Insert Into“ a jeho použití.
  2. Jak uložit výstup funkce s hodnotou tabulky v tabulce SQL.
  3. Jak uložit výstup funkce s hodnotou tabulky do tabulky SQL umístěné na vzdáleném serveru pomocí Linked Server.

  1. Co je nového v MariaDB Cluster 10.4

  2. ORA-30926:nelze získat stabilní sadu řádků ve zdrojových tabulkách

  3. Explicitní hodnotu pro sloupec identity v tabulce lze zadat pouze v případě, že je použit seznam sloupců a IDENTITY_INSERT je na serveru SQL Server.

  4. Rails:Žádný fond připojení pro ActiveRecord::Base