V tomto článku předvedu následující:
- Jak vložit výstup funkce s hodnotou tabulky do tabulky SQL.
- 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 INTOVALUES ( , .. )
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_AdmissiondateVý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:
- Lze jej spustit v rámci výběrového dotazu.
- Lze jej použít ve více částech dotazu, např. v příkazu Case, kde/mají klauzule.
- 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 ENDPomocí 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 TBLEMPLOYEESVý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:
- Na zdrojovém serveru (SQL_VM_1 ), vytvořte tabulkovou funkci s názvem „getCustomerByCountry “ na „AdventureWorks2014 ” databáze k naplnění dat.
- Na cílovém serveru vytvořte propojený server s názvem „Remote_Server ” pro provedení funkce (getCustomerByCountry ).
- 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'GOPo 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ŘEPISEMNyní 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:
- Příkaz „Insert Into“ a jeho použití.
- Jak uložit výstup funkce s hodnotou tabulky v tabulce SQL.
- Jak uložit výstup funkce s hodnotou tabulky do tabulky SQL umístěné na vzdáleném serveru pomocí Linked Server.