Динамично барање или „променлива @Tablename“. Променливи Променливи во sql

Пред да може да се користи променлива или константа во програма, таа скоро секогаш треба да се декларира. Сите објави мора да бидат ставени во делот за соопштенија на програмата PL/SQL. Во PL/SQL, декларациите може да се однесуваат на променливи, константи, TYPE (како збирки или записи) и исклучоци. Оваа статија опфаќа променливи и постојани декларации.

Декларирање PL/SQL променлива

Кога декларирате променлива, PL/SQL доделува меморија за да ја задржи нејзината вредност и на доделената мемориска област и дава име со кое вредноста може да се превземе и измени. Декларацијата, исто така, го одредува типот на податоци на променливата; се користи за проверка на вредностите што му се доделени. Основната синтакса за декларирање на променлива или константа е:

Тип на податоци за име [ := | DEFAULT default_value];

ЗАПОЧНЕТЕ ЗА book_rec ВО (ИЗБЕРИ * ОД книга) LOOP process_book (book_rec);

END LOOP; КРАЈ;

  • Придобивките од поврзаните реклами
  • Во сите декларации, типот на променливата (знак, нумерички, логички итн.) е експлицитно наведен. Секоја декларација директно го специфицира типот на податоци и, обично, ограничувањата наметнати од целта на тој тип. Ова е вообичаен пристап за декларирање на променливи, но може да предизвика проблеми во некои ситуации.

Синхронизација со колони на базата на податоци. Променливата PL/SQL често „претставува“ информации од табела со база на податоци. Ако експлицитно декларирате променлива и потоа ја промените структурата на табелата, таа може да ја прекине вашата програма.

Нормализација на локални променливи. Да речеме, променливата PL/SQL складира пресметани вредности што се користат на различни места во апликацијата. Кои се последиците од повторување (хард-кодирање) на исти типови на податоци и ограничувања во сите декларации?

Поставување променливи вредности

Во моментов, јазикот SQL обезбедува два начини за поставување на вредноста на променливата - можете да ја користите изјавата SELECT или SET за оваа намена. Во однос на функционалноста, овие изјави функционираат речиси идентично, освен што изјавата SELECT ви овозможува да ја добиете оригиналната вредност на доделувањето од табелата наведена во изјавата SELECT.

Забележете дека сите овие изјави вршат директни операции за доделување, или користејќи експлицитни вредности или други променливи. Не можете да ја користите изјавата SET за да доделите вредност на променлива што е преземена со барање; барањето мора да се изврши посебно и само после тоа добиениот резултат може да се додели со помош на изјавата SET. На пример, обидот да се изврши таква изјава предизвикува грешка:

ПОСТАВЕТЕ @c = COUNT(*) ОД градот

и следнава изјава се извршува доста успешно:

ПОСТАВЕТЕ @c = (ИЗБЕРЕТЕ БРОЈ (*) ОД Град)

Изјавата SELECT обично се користи за доделување вредности на променливи кога изворот на информациите што треба да се складираат во променливата е барање. На пример, дејствата извршени во кодот погоре се многу почесто имплементирани со користење на изјава SELECT:

ИЗБЕРЕТЕ @c = COUNT(*) ОД Градот

Забележете дека овој код е малку појасен (особено, тој е поконцизен, иако ги прави истите работи).

Така, можно е да се формулира следната општо прифатена конвенција за употреба на двата оператори.

Изјавата SET се користи кога треба да се изврши едноставна операција за доделување променлива, т.е. ако вредноста што се доделува е веќе дадена експлицитно во форма на одредена вредност или во форма на некоја друга променлива.

Изјавата SELECT се користи кога доделувањето вредност на променливата мора да се заснова на барање.

Користење на променливи во SQL пребарувања

Едно од корисните својства на T-SQL е тоа што променливите може да се користат во барања без потреба да се создаваат сложени динамички низи кои вградуваат променливи во програмскиот код. Динамичкиот SQL продолжува да постои, но една вредност може полесно да се промени - користејќи променлива.

Секаде каде што може да се користи израз во барањето, може да се користи и променлива. Следниот пример ја демонстрира употребата на променлива во клаузула WHERE:

ИЗЈАВИ @IdProd int;

SET @IdProd = 1;

ИЗБЕРИ

Microsoft SQL Server има посебен тип на податоци ТАБЕЛА, врз основа на кој можеме креирајте променливи на табелата, за да ги користите во вашите упатства и процедури, а денес ќе ги разгледаме овие променливи, ќе дознаеме како се декларирани и какви карактеристики имаат овие променливи.

Опис на променливите на табелата на MS SQL Server

Променливи на табелатасе променливи со посебен тип на податоци ТАБЕЛА кои се користат за привремено складирање на добиениот сет на податоци во форма на редови од табела. Тие се појавија во верзијата на SQL серверот од 2005 година. Можете да ги користите таквите променливи во складирани процедури, функции, предизвикувачи и редовни SQL пакети. Променливите на табелата се креираат на ист начин како и обичните променливи со нивното декларирање со исказот DECLARE.

Променливите од овој тип се наменети како алтернатива на привремените табели. Ако зборуваме за тоа дали е подобро да се користат табели променливи или привремени табели, тогаш нема јасен одговор променливите на табелата имаат и добри и лоши страни. На пример, јас лично сакам да користам променливи на табелата бидејќи тие се погодни за креирање ( тие. изјавуваат) и нема потреба да размислувате за нивно отстранување или чистење на крајот од упатствата, бидејќи тие автоматски се бришат ( исто како и редовните променливи). Но, во исто време, подобро е да користите променливи на табелата само кога ќе складирате мала количина на податоци во нив, инаку се препорачува да користите привремени табели.

Предности на променливите на табелата во Microsoft SQL Server

  • Променливите на табелата се однесуваат како локални променливи. Имаат точно дефинирано поле на примена;
  • Променливите на табелата автоматски се бришат на крајот од изјавата каде што биле дефинирани;
  • При користење на променливи на табели во складирани процедури, прекомпилациите се случуваат поретко отколку кога се користат привремени табели;
  • Трансакциите кои користат променливи TABLE продолжуваат само додека се ажурира соодветната променлива. Поради ова, променливите на табелата се со помала веројатност да бидат заклучени и бараат помалку ресурси за одржување на дневниците.

Недостатоци на променливите на табелата во MS SQL Server

  • Прашањата што ги менуваат променливите TABLE не создаваат паралелни планови за барање;
  • Променливите ТАБЕЛА немаат статистика за дистрибуција и не активираат прекомпилации, па затоа се препорачува да се користат за мал број редови;
  • Променливите на табелата не можат да се менуваат откако ќе се создадат;
  • Променливите на табелата не можат да се креираат со користење на изјава SELECT INTO;
  • Променливите TABLE не се менуваат за време на враќањето на трансакциите бидејќи имаат ограничен опсег и не се дел од постојаните бази на податоци.

Примери за користење на променливи на табелата во Microsoft SQL Server

Сега да продолжиме да вежбаме и прво би сакал да забележам дека мојот сервер е Microsoft SQL Server 2016 Express, со други зборови, сите прашања подолу беа извршени на оваа верзија на DBMS.

Прво, ајде да создадеме тест табела и да ја пополниме со тест податоци за да видиме како променливите на табелата може да се користат со редовни табели.

КРЕИРАЈ ТАБЕЛА Тестна табела(ИДЕНТИТЕТ НА ИД НА ПРОИЗВОД (1,1) НЕ НУЛЛ , („Печатач“) ОДИ ИЗБЕРИ * ОД Тест Табела


Ја користев изјавата CREATE TABLE за да ја креирам табелата TestTable, потоа ја користев изјавата INSERT во врска со конструкторот на вредности на табелата VALUES за да додадам податоци на табелата, а потоа ја искористив изјавата SELECT за да изберете од новосоздадената табела.

Декларирање на променлива на табелата и нејзино користење

Во овој пример, ќе декларираме променлива табела, ќе додадеме податоци на неа и ќе направиме избор од две табели ( табела променлива и редовна табела) со унија.

Декларирање на променлива на табелата DECLARE @TableVar TABLE(ProductId INT NOT NULL, Price MONEY NULL);


--Додавање податоци на променлива табела INSERT INTO @TableVar (ProductId, Price) VALUES (1, 500), (2, 300), (3, 200) --Користење променлива табела со податоци приклучи се SELECT TTable.ProductId, TTable .ProductName, TVar.Цена ОД @TableVar TVar LEFT JOIN TestTable TTable ON TVar.ProductId = TTable.ProductId

Креирање на променлива табела со примарен клуч, ЕДИНСТВЕНО ограничување и некластериран индекс

Овој пример покажува како можете да креирате примарен клуч, ЕДИНСТВЕНИ ограничувања и некластерирани индекси на променливите на табелата. Способноста да се создаде не-кластериран индекс е достапна уште од Microsoft SQL Server 2014 година.


Ова ја завршува мојата приказна за променливите на табелата, ако сакате детално да го проучите јазикот T-SQL, препорачувам да ја прочитате мојата книга „Патот на програмерот T-SQL“, се надевам дека материјалот ви беше корисен, чао!

Во овој материјал ќе разгледаме основи на програмирање во јазикот T-SQL, ќе дознаеме за каков јазик станува збор, какви основни способности има, какви конструкции вклучува и, се разбира, во процесот на сето ова ќе дадам примери за кодови.

И јас би сакал да започнам со фактот дека на оваа страница вие и јас веќе посветивме доста материјал на јазикот SQL, а особено неговата екстензија Transact-SQL ( Како разбирате T-SQL е кратенка за Transact-SQL). Па дури и сочинуваа мало водич за почетницина овој јазик и, се разбира, разгледавме многу примери, но како такво програмирање во T-SQL има, на пример, променливи, условни конструкции, коментари, допревме, но не се фокусиравме на ова. Но, бидејќи имаме страница за почетници програмери, решив да го посветам овој материјал на овие основи.

T-SQL програмски јазик

Transact-SQL (T-SQL) е продолжение на јазикот SQL од Microsoft и се користи во SQL Server за програмирање на бази на податоци.

SQL Server вклучува многу конструкции, компоненти и функции кои ги прошируваат можностите на ANSI стандардниот SQL јазик, вклучувајќи го и класичното програмирање, кое се разликува од конвенционалното пишување барања.

И денес ќе го разгледаме тој дел од основите на јазикот T-SQL, кој вклучува пишување код за имплементација на одредена функционалност ( на пример, во постапка или функција), а не само некое барање за базата на податоци.

Променливи во T-SQL

И ќе започнеме со променливи, тие се потребни за да складираме некои привремени податоци кои треба да ги зачуваме некое време и потоа да ги користиме.

Постојат два типа на променливи во T-SQL - локални и глобални. Локалните променливи постојат само во рамките на сесијата за време на која се креирани, додека глобалните променливи се користат за да се добијат информации за SQL серверот или некои информации кои се менуваат во базата на податоци.

Локалните променливи се декларираат со помош на клучниот збор ИЗЈАВАи започнете со знакот @ . Како и во многу програмски јазици, променливите во T-SQL мора да имаат специфичен тип на податоци. Има доста типови на податоци во SQL-серверот, ги испитавме детално во референтната книга што ја споменав веднаш.

Можете да ги користите командите за да доделите вредност на променливата ПОСТАВЕТЕили Изберете.

Како што веќе реков, потребни се глобални променливи за да се добијат какви било информации за серверот или базата на податоци, на пример, глобалните променливи во SQL Server вклучуваат:

  • @@ROWCOUNT – го зачувува бројот на записи обработени со претходната команда;
  • @@ERROR – го враќа кодот за грешка за последната команда;
  • @@SERVERNAME — име на локалниот SQL сервер;
  • @@VERSION - број на верзија на SQL Server;
  • @@IDENTITY е последната бројачка вредност што се користи во операцијата за вметнување ( вметнете).

Сега, како пример, ајде да создадеме две променливи со тип на податоци INT, да им доделиме вредности, првата користејќи ја командата SET, а втората користејќи ја командата Select, потоа едноставно да ги прикаже овие вредности, а исто така да ја прикаже вредноста на @@VERSION променлива, т.е. Дознајте ја верзијата на серверот SQL.

ИЗБЕРЕТЕ @TestVar1 INT ОБЈАВИ @TestVar2 INT SET @TestVar1 = 1 SELECT @TestVar2 = 2 SELECT @TestVar1 AS [Variable 1], @TestVar2 AS [Variable 2], @@VERSION AS [SQL Server Version]

Пакети

Пакет во T-SQL- ова се SQL команди или изјави кои се комбинираат во една група и SQL серверот ќе ги компајлира и извршува како целина.

За да му дозволите на SQL-серверот да разбере дека пренесувате серија команди, мора да го наведете клучниот збор ОДИпо сите команди што сакате да ги комбинирате во пакет.

Локалните променливи ќе бидат видливи само во пакетот во кој се креирани, т.е. Веќе нема да можете да пристапите до променливата откако ќе заврши пакетот.

Да речеме, ако примерот што го користевме погоре се комбинира во пакет и потоа се обидеме да ги добиеме вредностите на променливите, тогаш ќе го добиеме следново:


Оние. гледаме дека имаме грешка поради фактот што променливата @TestVar1 не е декларирана.

Услови

Овие конструкции подразбираат разгранување, т.е. Во зависност од тоа дали одредени услови се исполнети или не, исказите на T-SQL ќе ја променат насоката.

АКО... ДРУГО

Оваа конструкција постои, веројатно во сите програмски јазици, вклучува проверка дали се исполнети условите и ако се поминат сите проверки, тогаш се извршува командата што следи, ако не, тогаш ништо не се извршува, но можете да го наведете клучниот збор ELSE и потоа во во овој случај наведените оператори ќе бидат извршени по овој збор.

DECLARE @TestVar1 INT ИЗЈАВА @TestVar2 VARCHAR(20) SET @TestVar1 = 5 IF @TestVar1 > 0 SET @TestVar2 = "Поголема од 0" ДРУГО ПОСТАВЕТЕ @TestVar2 = "Помалку од 0" SELECT2AS [TestVar]V

АКО ПОСТОИ

Оваа конструкција ви овозможува да го одредите присуството на записи дефинирани со услов. На пример, сакаме да знаеме дали има одредени записи во табелата и кога ќе се открие првото совпаѓање, обработката на командите престанува. Во суштина ова е исто како COUNT(*) > 0.

На пример, сакаме да провериме дали има записи со id вредност >=0 во табелата test_table и врз основа на ова ќе одлучиме како да продолжиме


ИЗЈАВИ @TestVar VARCHAR(20) IF EXISTS (SELECT * FROM test_table WHERE id > = 0) SET @TestVar = "Присутни записи" ELSE SET @TestVar = "Нема присутни записи" ИЗБЕРЕТЕ @TestVar AS [Присутни записи]

СЛУЧАЈ

Оваа конструкција се користи заедно со изјавата Select и е наменета да ја замени повторената употреба на конструкцијата IF. Корисно е во случаи кога треба да проверите променлива ( или поле) за присуство на одредени вредности.


ИЗБЕРЕТЕ @TestVar1 INT ИЗЈАВАТЕ @TestVar2 VARCHAR(20) SET @TestVar1 = 1 ИЗБЕРЕТЕ @TestVar2 = СЛУЧАЈ @TestVar1 КОГА 1 ТОГАШ „Еден“ КОГА 2 ТОГАШ „Два“ ДРУГО „Непознат“ КРАЈ ИЗБЕРЕ @TestVar2]

ПОЧЕТ...КРАЈ

Оваа конструкција е неопходна за да се создаде блок од команди, т.е. на пример, ако сакаме да извршиме не една команда по блокот IF, туку неколку, тогаш ќе треба да ги напишеме сите команди во блокот BEGIN...END.

Ајде да го измениме нашиот претходен пример ( за АКО ПОСТОИ) така што ако има записи id > = 0 во табелата test_table, освен што ќе доделиме вредност на променливата @TestVar, ќе извршиме и ажурирање, т.е. ажурирање на некои податоци во истата табела, а исто така прикажување на бројот на редови што ги ажуриравме користејќи ја глобалната променлива @@ROWCOUNT.


ОБЈАВИ @TestVar1 VARCHAR(20) ИЗЈАВИ @TestVar2 INT SET @TestVar2 = 0 IF EXISTS (ИЗБЕРЕТЕ * ОД test_table WHERE id > = 0) BEGIN SET @TestVar1 = „Записите постојат“ АЖУРИРАЈ = тест_табела SETHEREET 5 = @TestVar2 = @@ROWCOUNT КРАЈ ДРУГ ПОСТАВЕНИ @TestVar1 = „Нема записи“ ИЗБЕРЕТЕ @TestVar1 AS [Присутни записи], @TestVar2 AS [Редовите се засегнати:]

T-SQL јамки

Ако зборуваме за јамки воопшто, тие се потребни за да се повторува извршувањето на командите многу пати. Има една јамка во T-SQL ДОДЕКА со предуслов, тоа значи дека командите ќе започнат и ќе се повторуваат додека не се исполни условот пред почетокот на циклусот, исто така, извршувањето на циклусот може да се контролира со помош на клучни зборови ПАКУВАЊЕИ ПРОДОЛЖИ.


ИЗБЕРЕТЕ @Cnt INT = 1, @result INT = 0, @CountRow INT SELECT @CountRow = COUNT(*) ОД test_table ДОДЕКА @Cnt<= @CountRow BEGIN SET @Cnt += 1 SET @result += 1 IF @Cnt = 20 BREAK ELSE CONTINUE END SELECT @result AS [Количество выполнений цикла:]

Во овој пример, прво, се разбира, ги декларираме променливите ( Веднаш го иницијализираме Cnt и резултираме, на овој начин можете да ги поставите вредностите на променливите почнувајќи од SQL Server 2008). Потоа дознаваме колку редови има во табелата test_table и после тоа проверуваме дали бројот на редови во табелата е поголем или еднаков на нашиот бројач, па ја внесуваме нашата тест циклус. Во јамката ја зголемуваме вредноста на бројачот, го пишуваме резултатот и повторно проверуваме, ако нашиот бројач веќе ја достигнал вредноста 20, тогаш ќе го присилиме да заврши, ако не, тогаш нека продолжи додека вредноста на бројачот не стане поголема или еднаква до бројот на редови во табелата или до 20 ако има повеќе редови во табелата.

Коментари

Тие се потребни за да се објаснат и да се земат белешки во кодот, бидејќи ако кодот е голем и сложен, тогаш по некое време едноставно можете да заборавите зошто е тоа точно и зошто сте го напишале овој или оној дел од кодот. Во T-SQL, постојат коментари со една линија (-Text) и повеќелиниски коментари (/*Text*/).


T-SQL команди

GOTO

Користејќи ја оваа команда, можете да се движите низ кодот до одредена етикета. На пример, може да се користи кога сакате да направите еден вид јамка, но без време.


DECLARE @Cnt INT = 0 Label: --Поставете ја етикетата SET @Cnt += 1 --Додадете 1 на променливата ако @Cnt< 10 GOTO Metka --Если значение меньше 10, то переходим к метке SELECT @Cnt AS [Значение Cnt =]

ЧЕКАЈ

Командата може да го паузира извршувањето на кодот за одреден временски период или до одредено време. Параметар ОДЛОЖУВАЊЕправи пауза со дадена должина и ВРЕМЕго паузира процесот до одреденото време. Вредностите на параметрите се наведени во форматот ч:ми:сс


ИЗЈАВИ @TimeStart time, @TimeEnd time SET @TimeStart = CONVERT (време, GETDATE())--Дознајте го времето WAITFOR DELAY „00:00:05“--Пауза за 5 секунди SET @TimeEnd = CONVERT (време, GETDATE ()) )--Повторно дознајте го времето --Дознајте колку време поминало во секунди ИЗБЕРЕТЕ DATEDIFF(ss, @TimeStart, @TimeEnd) AS [Seconds Passed:]

ВРАЌАЈ

Оваа команда се користи за безусловно излегување од барање или процедура. RETURN може да се користи во која било точка за да излезете од процедура, серија или блок на изјави. Сè што доаѓа по оваа команда не се извршува.


DECLARE @Cnt INT = 1, @result varchar(15) /*Ако вредноста Cnt е помала од 0, тогаш следните команди нема да се извршат и нема да ја видите колоната [Result:]*/ IF @Cnt< 0 RETURN SET @result = "Cnt больше 0" SELECT @result AS [Результат:]

ПЕЧАТЕЊЕ

За да испратите услужна порака, можете да ја користите командата ПЕЧАТЕЊЕ. Во Менаџмент Студио, оваа порака ќе се појави во картичката Пораки ( Пораки).


DECLARE @Cnt INT = 10, @TestVar varchar(100) IF @Cnt > 0 SET @TestVar = "Вредноста на променливата Cnt е поголема од 0 и еднаква на " + CAST(@Cnt AS VARCHAR(10)) ElSE SET @TestVar = "Вредноста на променливата Cnt е помала од 0 и еднаква на " + CAST(@Cnt AS VARCHAR(10)) PRINT @TestVar

Трансакции

Трансакцијае команда или блок од команди што се завршуваат успешно или се откажуваат како целина. Со други зборови, ако една команда или инструкција во трансакцијата не успее, тогаш сè што било обработено пред да биде исто така откажано, дури и ако претходните команди биле успешно завршени.

Овој механизам е неопходен за да се обезбеди интегритет на податоците, т.е. Да речеме дека имате процедура со која се префрлаат пари од една на друга сметка, но може да се појави ситуација во која парите биле подигнати од сметката, но не пристигнале на друга сметка. На пример, инструкцијата SQL која повлекува пари работеше, но при извршувањето на инструкцијата со која се депонирани пари, се појави грешка, со други зборови, парите беа повлечени и едноставно изгубени. За да се спречи ова, сите SQL изјави се запишуваат внатре во трансакцијата, а потоа доколку дојде до таква ситуација, сите промени ќе бидат откажани, т.е. парите ќе бидат вратени на вашата сметка.

Ајде да дознаеме што има во нашата табела (ид = ИДЕНТИТЕТ) ИЗБЕРЕТЕ * ОД тест_табела -- Започнете ја трансакцијата ПОЧНЕТЕ ТРАН --Прво ажурирајте ги сите податоци АЖУРИРАЈТЕ тест_табела SET колона1 = колона1 - 5 -- Потоа само додадете редови со нови вредности INSERT INTO test_table ИЗБЕРИ колона1 ОД test_table --Ако има грешка, тогаш откажете сè IF @@error != 0 ПОЧНЕТЕ ВРАЌАЊЕ TRANS RETURN END COMMIT TRAN --Ајде да видиме што се случило SELECT * FROM test_table

Во овој пример, ако имавме грешка при додавање податоци (INSERT), тогаш АЖУРИРАЊЕТО ќе биде откажано.

Ракување со грешки - ПРОБАЈ...ФАТИ конструкција

При извршувањето на T-SQL кодот може да се појави неочекувана ситуација, т.е. грешка што треба да се справи. Во SQL серверот, почнувајќи со SQL Server 2005, постои таков конструкт како ПРОБАЈ...ФАТИ, кој може да ја следи грешката.


ЗАПОЧНЕТЕ ОБИДЕТЕ ДА ИЗЈАВАТЕ @TestVar1 INT = 10, @TestVar2 INT = 0, @result INT SET @result = @TestVar1 / @TestVar2 КРАЈ ОБИДЕТЕ ГО ПОЧЕТЕ ФОТИ ИЗБЕРЕТЕ ГРЕШКА_NUMBER() КАКО [број на грешка], опис ERROR_MESSAGE() END ФАТИ

Во овој пример, се појави ситуација дека се случува делење со нула ( Како што знаете, не можете да поделите со 0) и бидејќи нашиот блок код беше поставен во конструкција TRY, добивме исклучок во кој едноставно го добиваме бројот на грешката и нејзиниот опис.

Мислам дека ова е доволно за основите, ако сакате подетално да ги проучите сите конструкции на јазикот T-SQL, препорачувам да ја прочитате мојата книга “ Патеката на програмерот T-SQL“, во кој веќе подетално се дискутира за јазикот T-SQL, готово, со среќа!