В тази статия ще демонстрирам следното:
- Как да вмъкна изхода на функция с таблично значение в SQL таблица.
- Как да вмъкна изхода на функция с таблична стойност, която е създадена на отдалечения сървър на база данни.
Какво е изразът „Insert into“
В RDBMS „Insert into“ е един от основните SQL изрази. Използва се за вмъкване на нови записи в SQL таблица. Използвайки израза, можем да изпълним следните задачи:
- Вмъкване на нови записи в таблица (Основно вмъкване).
- Вмъкнете стойности на конкретна колона в таблица.
- Вмъкнете изхода, генериран от съхранена процедура, в SQL таблица.
За да демонстрираме горното, нека създадем таблица с име „Студенти ” в DemoDatabase. Изпълнете следния код, за да създадете таблицата:
СЪЗДАВАНЕ НА ТАБЛИЦА УЧЕНИЦИ ( ID INT IDENTITY(1, 1) ПЪРВИЧЕН КЛЮЧ, ПЪРВО ИМЕ VARCHAR(250), ФАМИЛНО ИМЕ VARCHAR(250), ДАТА НА ПРИЕМ, ДАТА ВРЕМЕ, ОЦЕНКА CHAR(1) )
Извършете основно вмъкване
За да извършим основно вмъкване, трябва да предоставим името на целевата таблица и стойностите на таблицата. Следва основният синтаксис на основния израз за вмъкване:
INSERT INTOСТОЙНОСТИ ( <стойност ЗА КОЛОНА 1>, <стойност ЗА КОЛОНА 1>.. )
Например, искаме да вмъкнем собствено име, фамилия и оценка на трима ученици в таблицата „Студенти“. За да направите това, изпълнете следния код:
ВЪВЕДЕТЕ В ЦЕННОСТИ НА СТУДЕНТИТЕ ('NISARG', 'UPADHYAY', '2018-09-11', 'A'), ('RAGHAV', 'DATTA', '2017-10-01', 'A') , ('KIRAN', 'AMIN', '2016-01-31', 'A')
Изпълнете заявката „Избор“ срещу „Студент“, за да прегледате резултатите.
ИЗБЕРЕТЕ ПЪРВО ИМЕ, ФАМИЛИЯ, ДАТА НА ПРИЕМ, ОЦЕНКА ОТ СТУДЕНТИТЕ
Резултатът е следният:
Вмъкнете стойности на конкретна колона в таблицата
За да вмъкнете стойности в конкретни колони на таблица, трябва да предоставите името на целевата таблица и името на колоните, в които искате да вмъкнете данни. Следва синтаксисът.
ВЪВЕТЕ В <ИМЕ НА ЦЕЛЕВАТА ТАБЛИЦА> ( КОЛОНА 1 , КОЛОНА 2 ) СТОЙНОСТИ ( <СТОЙНОСТ ЗА КОЛОНА 1>, <СТОЙНОСТ ЗА КОЛОНА 1>.. )
Например искаме да вмъкнем собствено и фамилно име на двама студенти в „Студенти ” таблица. За да направите това, изпълнете следния код:
ВЪВЕДЕТЕ В СТУДЕНТИТЕ (ИМЕ, ФАМИЛИЯ) СТОЙНОСТИ ('NIMESH', 'UPADHYAY'), ('RUPESH', 'DATTA')
Изпълнете заявката „Select“ срещу „Студенти ” таблица.
ИЗБЕРЕТЕ ПЪРВО ИМЕ, ФАМИЛИЯ, ДАТА НА ПРИЕМ, ОЦЕНКА ОТ СТУДЕНТИТЕ
Резултатът изглежда по следния начин:
Вмъкнете изхода, генериран чрез съхранена процедура
За да вмъкнем изхода на съхранена процедура в таблицата, трябва да посочим името на целевата таблица и изходната съхранена процедура. За да генерираме изхода на съхранената процедура, трябва да използваме ключовата дума „exec“ или „EXECUTE“. Така че, трябва да предоставим името на таблицата или имената на колоните, последвани от ключовата дума „exec“. Следният е синтаксисът:
INSERT INTO <ИМЕ НА ЦЕЛЕВАТА ТАБЛИЦА> (КОЛОНА 1, КОЛОНА 2) EXEC
Например, искаме да вмъкнем изхода от процедурата, която попълва имената на студентите, чиято дата на прием не е нулева. За да направим това, ще създадем съхранена процедура с име „spGet_Student_AdmissionDate “. За да създадете съхранена процедура, изпълнете следния код:
ИЗПОЛЗВАЙТЕ DEMODATABASE GO CREATE PROCEDURE SPGET_STUDENT_ADMISSIONDATE КАТО BEGIN SELECT ISNULL(FIRSTNAME, '') + ' ' + ISNULL(LASTNAME, '') КАТО STUDENTNAME, ADMISSIONDATE, OCPE FROM STUDENTS, WHERE EDMISSION DATE След като процедурата бъде създадена, стартирайте процедурата, като изпълните следния код:ИЗПЪЛНЕТЕ spGet_Student_AdmissiondateРезултатът изглежда по следния начин:
Както споменах по-горе, искаме да вмъкнем изхода на съхранената процедура с име „spGet_Student_Admissiondate ” във временна таблица. Първо, изпълнете следния код, за да създадете таблицата:
( ID INT IDENTITY(1, 1), STUDENTNAME VARCHAR(250), ADMISSIONDATE DATETIME, GRADE CHAR(1) )След като таблицата е създадена, изпълнете следния код, за да вмъкнете изхода на „spGet_Student_Admissiondate ” до „#TempStudents “.
INSERT INTO #TEMPSTUDENTS EXECUTE SPGET_STUDENT_ADMISSIONDATE Изход:(3 реда засегнати)Сега нека проверим изхода на „#TEMPSTUDENTS “. За да направите това, изпълнете следния код:
Сега, както споменах по-горе, ще демонстрирам как можем да вмъкнем изход, генериран от функция с таблично стойност, в SQL таблица. Първо, нека разберем какво е функция с таблично значение.
Какво е функция с таблична стойност
Функцията със стойност на таблица е специален T-SQL код, който приема параметри/параметри и въз основа на условията, дефинирани в променлива, връща набора от резултати в променливата на таблицата. Следните са предимствата от използването на функцията с таблично значение:
- Може да се изпълни в рамките на заявката Select.
- Може да се използва в множество части на заявка, например в оператора Case, където/има клаузи.
- Изходът на функция с таблично значение е набор от записи, следователно можете да се присъедините към функцията с таблици.
Вмъкване на изход на вградена функция със стойност на таблица в SQL таблица
В този раздел ще обясня как да вмъкна изхода на функция с таблична стойност в SQL таблица с помощта на T-SQL.
За демонстрация използвам базата данни AdventureWorks2014. Създадох вградена многозначна таблична функция с име „GetEmployeesbyHireDate ” Тази функция попълва информация за служителите, наети в рамките на определена дата и час. Функцията използва @FormDate и @Toda те параметри за филтриране на данните. Резултатът от функцията ще бъде съхранен в SQL таблица.
Следният код създава функция:
СЪЗДАВАНЕ НА ФУНКЦИЯ GETEMPLOYEESBYHIREDATE (@FROMDATE КАТО DATETIME, @TODATE КАТО DATETIME) ВРЪЩА ТАБЛИЦА @EMPLOYEES (EMPLOYEENAME VARCHAR (MAX), ДАТА НА РОЖДЕНИЕ DATETIME, JOBTITLE VARCHAR(150), EMAILID VARCHARPHONE20NUMBER ДАТА ВРЕМЕ ) КАТО ЗАПОЧВАНЕ ВМЕСТЕ В @СЛУЖИТЕЛИ ИЗБЕРЕТЕ ( ISNULL( B.FIRSTNAME, '') + ' ' + ISNULL( B.MIDDLENAME, '') + ' ' + ISNULL( B.LASTNAME, '') )КАТО ИМЕ НА СЛУЖИТЕЛ, A .ДАТА НА РОЖДЕНИЕ, B.JOBTITLE, B.EMAILADDRESS, B.ТЕЛЕФОНЕН НОМЕР, A.НАЕМАНЕ ОТ [Човешки ресурси].[СЛУЖИТЕЛ] ВЪТРЕШНО ПРИСЪЕДИНЕНИЕ [Човешки ресурси].[VEMPLOYEE] B ON A.BUSINESSENTITYID =B.BUSINESSENTITYID, КЪДЕТО ДАТА НА БИЗНЕС. @FROMDATE И @TODATE RETURN ENDИзползвайки заявката Select, можем да получим изхода на SQL функция. Например, искате да попълните списък със служители, наети през 2009 г. Изпълнете следната заявка, за да получите списъка:
DECLARE @FROMDT DATETIME DECLARE @TODT DATETIME SET @FROMDT='2009-01-01' SET @TODT='2009-12-31' SELECT * ОТ GETEMPLOYEESBYHIREDATE(@FROMDT, @TODT)Резултатът от горната заявка изглежда по следния начин:
Сега създайте таблица с име „tblEmploye e“, за да съхранявате изхода на „GetEmployeesbyHiredate ” функция. Следният код създава таблицата с име „tblEmployee “.
СЪЗДАВАНЕ НА ТАБЛИЦА TBLEMPLOYEES (ИМЕ НА СЛУЖИТЕЛ VARCHAR (МАКС), ДАТА НА РОЖДЕНИЕ, ДАТА ВРЕМЕ, РАБОТА VARCHAR(150), ИМЕЙЛ ИД VARCHAR(100), ТЕЛЕФОНЕН НОМЕР VARCHAR(20), ДАТА НА НАЕМАНЕ ДАТА ВРЕМЕ )Както споменах по-рано, искаме да попълним информацията за служителите, които са били наети през 2009 г. За да направите това, вмъкнете изхода на GetEmployeesbyHireDate функция в tblEmployees маса. За да направите това, изпълнете следния код:
DECLARE @FROMDT DATETIME DECLARE @TODT DATETIME SET @FROMDT='2009-01-01' SET @TODT='2009-12-31' INSERT INTO TBLEMPLOYEES ИЗБЕРЕТЕ ИМЕ НА СЛУЖИТЕЛ, ДАТА НА РОЖДЕНИЕ, JOBDATEREPHYDATERE, ELECTRONICS, EMAIL, Email (@FROMDT, @TODT)Нека проверим дали данните са вмъкнати в таблицата. За да направите това, изпълнете следния код:
ИЗБЕРЕТЕ * ОТ СЛУЖИТЕЛИРезултатът изглежда по следния начин:
Вмъкване на данни в таблици от отдалечени бази данни
Понякога може да искате да извлечете данни от сървърите, съхранявани в различен център за данни. Това може да стане с помощта на SQL свързан сървър.
В този раздел ще обясня как да вмъкна изхода на функцията с таблица, създадена на отдалечения сървър. Сега, за да демонстрираме сценария, следното е настройката.
[table id=57 /]
В демонстрацията ще изпълним следните задачи:
- На изходния сървър (SQL_VM_1 ), създайте функция със стойност на таблица, наречена „getCustomerByCountry ” на „AdventureWorks2014 ” база данни за попълване на данните.
- На целевия сървър създайте свързан сървър с име „Remote_Server ”, за да изпълни функцията (getCustomerByCountry ).
- На целевия сървър създайте таблица с име „Клиент ” за съхраняване на данни, извлечени от отдалечената функция (getCustomerByCountry ).
Следното изображение илюстрира настройката.
Задачата, която трябва да бъде изпълнена на изходен сървър:
На изходния сървър (SQL_VM_1 ), създайте функция с име „getCustomerByCountry ” Той попълва подробности за клиент, намиращ се в конкретна държава или регион. Функцията използва @CountryName параметър за филтриране на данните. Изпълнете следния код, за да създадете функцията.
Промяна на FUNCTION Getcustomerbycountry(@CountryName VARCHAR)връща @Customers TABLE (име_на_клиент VARCHAR(500), номер на телефон VARCHAR(50), имейл адрес VARCHAR(100), адрес VARCHAR(max), град VARCHAR(150), държава ), пощенски код VARCHAR(50)) КАТО ЗАПОЧНЕТЕ ВМЕСЕТЕ В @Customers ИЗБЕРЕТЕ име_на_клиент, номер на телефон, имейл адрес, адрес, град, държава, пощенски код ОТ клиенти КЪДЕТО държава [email protected] ВРЪЩАНЕ КРАЙЗадачите, които трябва да се изпълняват на целевия сървър:
За да попълните данни от изходния сървър (SQL_VM_1 ), първо създайте свързан сървър между източника (SQL_VM_1 ) и дестинация (SQL_VM_ 2). Изпълнете следния код на целевия сървър (SQL_VM_2 ), за да създадете свързан сървър.
ИЗПОЛЗВАЙТЕ [MASTER]GOEXEC MASTER.DBO.SP_ADDLINKEDSERVER @SERVER =N'SQL_VM_1', @SRVPRODUCT=N'SQL SERVER'GOEXEC MASTER.DBO.SP_ADDLINKEDSRVLOGIN @RMTSRVNAME=N' Remote@USESELF'=N', ,@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_Ser , @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'ВРЕМЕ ЗА СЪЕДИНЕНИЕ', @OPTVALUE=N'0'GOEXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'Отдалечен_сървър', @OPTNAME=N'ИМЕ НА СЪБИРАНЕ', @OPTVALUE=NULLGOEXEC MASTER.DBO.SP_SERVEROPTION @SER 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'ИЗПОЛЗВАНЕ НА ДИСТАНЦИОННО СЪБОРЯВАНЕ', @OPTVALUE=N'TRUE'GOEXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'Remote_OP_Server', N'REMOTE PROC TRANSACTION PROMOTION', @OPTVALUE=N'FALSE'GOСлед като свързаният сървър е създаден, създайте SQL таблица за съхраняване на информацията за клиентите и я попълнете чрез изпълнение на SQL функцията, създадена на изходния сървър (SQL_VM_1 ).
Изпълнете следния код, за да създадете таблица.
ИЗПОЛЗВАЙТЕ DEMODATABASEGOCREATE ТАБЛИЦА КЛИЕНТИ ( ID INT IDENTITY(1, 1), CUSTOMER_NAME VARCHAR(500), ТЕЛЕФОНЕН НОМЕР VARCHAR(50), EMAILADDRESS VARCHAR(100), АДРЕС VARCHAR(MAX), CITY VARCHAR(150), 250), VARCHAR (50) )Използвайки свързан сървър, можем да изпълним функцията с таблица, създадена на отдалечен сървър на база данни. Когато се опитате да изпълните функцията с помощта на свързан сървър, възниква следната грешка:
Съобщение 4122, ниво 16, състояние 1, ред 28 Извикванията на функции с отдалечена стойност на таблица не са разрешени.Следователно, за да изпълним която и да е функция на отдалечения сървър, трябва да използваме ключовата дума OPENQUERY. Използва се за инициализиране на ad hoc разпределената заявка с помощта на свързан сървър. Вижте тази статия, за да разберете концепцията за ОТВАРЯНЕ.
За да използваме OPENQUERY, трябва да активираме разширен конфигурационен параметър с име „Ad Hoc разпределени заявки ” на изходния и дестинационния сървър. Изпълнете следния код, за да го активирате.
ИЗПОЛЗВАЙТЕ MASTERGOEXEC SP_CONFIGURE 'ПОКАЗВАНЕ НА РАЗПРЕДЕЛНАТА ОПЦИЯ', 1ПРЕКОНФИГУРИРАЙТЕ С OVERRIDEEXEC SP_CONFIGURE 'AD HOC РАЗПРЕДЕЛЕНИ ЗАПИСКИ', 1ПРЕКОНФИГУРИРАЙТЕ С ОТМЕНЯНЕСега искам да попълня списъка с клиенти, намиращи се в Обединеното кралство и да ги вмъкна в „Клиенти ” таблица. Както споменах, функцията приема името на държавата, за да филтрира записите. Сега трябва да изпълним следния скрипт на целевия сървър (SQL_VM_2 ), за да попълните списъка с клиенти, намиращи се в „Обединеното кралство“.
ИЗБЕРЕТЕ CUSTOMER_NAME, PHOENNUMBER, EMAILADDRESS, ADDRESS, CITY, COUNTRY, POTALCODE ОТ OPENQUERY([TTI609-VM2], 'DECLARE @COUNTRY VARCHAR(150)SET @COUNTRY=''ОБЕДИНЕНО КРАЛСТВО'' SELECTURE * FROMORKSADV0 .DBO.GETCUSTOMERBYCOUNTRY(''''+ @COUNTRY +'''')' )Резултатът изглежда по следния начин:
Сега, за да вмъкнете данни, попълнени от в таблицата „Клиенти“, изпълнете следния скрипт на целевия сървър (SQL_VM_2 ).
ВЪВЕДЕТЕ В КЛИЕНТИТЕ (ИМЕ НА КЛИЕНТ, ТЕЛЕФОНЕН НОМЕР, АДРЕС НА ИМЕЙЛ, АДРЕС, ГРАД, СТРАНА, ПОЩЕНСКИ КОД) ИЗБЕРЕТЕ ИМЕ НА КЛИЕНТ, PHOENNUMBER, ИМЕЙЛ АДРЕС, АДРЕС, ГРАД, СТРАНА, ПОЩЕВЕН КОД ОТ OPENQUERY([TTI609, COUNTRY, REMC2] 150)ЗАДАДЕТЕ @COUNTRY=''ОБЕДИНЕНО КРАЛСТВО'' ИЗБЕРЕТЕ * ОТ [ADVENTUREWORKS2014].DBO.GETCUSTOMERBYCOUNTRY(''''+ @COUNTRY +'''')' )/*Изход*/(1913 засегнати реда)предварително>Сега нека проверим дали данните са въведени правилно. За да проверите, изпълнете следната заявка на целевия сървър (SQL_VM_2).
ИЗПОЛЗВАЙТЕ DEMODATABASEGOSELECT ТОП 20 CUSTOMER_NAME, ТЕЛЕФОНЕН НОМЕР, ИМЕЙЛ АДРЕС, АДРЕС, ГРАД, СТРАНА, ПОЩЕНСКИ КОД ОТ КЛИЕНТИРезултатът изглежда по следния начин:
Резюме
В тази статия разгледах:
- Изявление „Insert Into“ и неговото използване.
- Как да запишете изхода на функцията с таблично значение в SQL таблица.
- Как да запишете изхода на функцията с таблична стойност в SQL таблицата, разположена на отдалечен сървър, използвайки свързан сървър.