ХОНХ

Энэ мэдээг чамаас өмнө уншсан хүмүүс бий.
Шинэ нийтлэлүүдийг хүлээн авахын тулд бүртгүүлээрэй.
Имэйл
Нэр
Овог
Та Хонхыг хэрхэн уншихыг хүсч байна вэ?
Спам байхгүй

Шинэ T-SQL програмистуудын хамгийн түрүүнд тавьдаг асуултуудын нэг бол "Би хувьсагчид нэр нь орсон хүснэгтээс сонголтоо хэрхэн авах вэ?" Гэсэн асуулт байж магадгүй юм.
Учир нь T-SQL нь асуулгын зарим хэсэгт хувьсах утгыг ашиглахыг зөвшөөрдөггүй тул цорын ганц боломжит шийдэл бол динамик асуулга ашиглах явдал юм. Санаа нь маш энгийн: гүйцэтгэх ёстой асуулгын мөрийг тусгайлан тодорхойлсон хувьсагчаар "цуглуулсан". Дараа нь энэ мөрийг гүйцэтгэнэ. Эхлүүлэх ажлыг хоёр аргаар хийж болно
- EXECUTE командыг ашиглан
- sp_executesql системийн процедурыг ашиглан.

Энэ нь нэг иймэрхүү харагдаж байна

@SQL varchar-ыг зарлах ( 8000 ), @table_name varchar ( 10 ) SET @SQL = "SELECT * FROM" + @table_name exec (@SQL) --or exec sp_executesql @SQL Ер нь динамик асуулга нь хадгалагдсан процедур дотор үүсдэг бөгөөд үүнд оролтын параметр дээр үндэслэн тодорхой гүйцэтгэх мөрийг эмхэтгэдэг.

I. Динамик асуулгын онцлог
1. Динамик хүсэлтийг ҮРГЭЛЖ НЭГ ХОЛБОГДОЛТОЙ, ТУСДАА БАГЦ болгон гүйцэтгэнэ. Өөрөөр хэлбэл, ийм асуулга ашиглах үед,
- танд динамик асуулга дуудахын өмнө зарласан локал хувьсагчдад хандах эрх байхгүй (гэхдээ та өмнө нь үүсгэсэн түр хүснэгтүүдэд хандах боломжтой)
- exec командыг гүйцэтгэх явцад үүссэн локал түр зуурын хүснэгтүүд болон хувьсагчдыг дуудах процедурт ашиглах боломжгүй, учир нь exec-г гүйцэтгэж байгаа багцын төгсгөлд устгагдах болно.

2. Динамик асуулга нь процедурын эзэмшигчийн эрхээр бус, харин ПРОЦЕДУРЫГ ДУУДСАН ХЭРЭГЛЭГЧИЙН ЭРХээр ҮРГЭЛЖ хийгдэнэ. Өөрөөр хэлбэл Procedure1-ийн эзэмшигч нь Хэрэглэгч1 бөгөөд Хүснэгт1-ийн эрхтэй бол Хэрэглэгч2-д Хүснэгт1-д динамик хайлтаар хандсан тохиолдолд Процедур1-ийг гүйцэтгэх эрхийг олгох нь хангалтгүй юм. Та түүнд 1-р хүснэгтийн зохих эрхийг шууд өгөх ёстой.

3. Хүсэлтийг эмхэтгэх нь түүнийг дуудахын өмнө шууд хийгддэг. Тэдгээр. Зөвхөн энэ мөчид та бүх синтакс алдааг мэдэх болно.

II.exec командыг ашиглах онцлог
1. exec команд нь мөр ба/эсвэл хувьсагчийн холболтыг аргумент болгон хүлээн авдаг. ГЭХДЭЭ функцийн гүйцэтгэлийн үр дүнг нэгтгэхийг дэмждэггүй, i.e. гэх мэт загварууд
exec("SELECT * FROM" + ЗҮҮН(@ХүснэгтНэр, 10 )) хэрэглэхийг хориглоно.
2. Команд нь оролт/гаралтын параметргүй.

III.Sp_executesql процедурыг ашиглах онцлог
1. Процедур нь мөр ба/эсвэл хувьсагчдыг параметр болгон холбохыг дэмждэггүй.
2. Хүсэлтийн текст нь NVARCHAR/NCAR төрлийн хувьсагч эсвэл ижил төрлийн мөрийн тогтмол байх ёстой.
3. Гүйцэтгэх скрипт рүү параметрүүдийг шилжүүлж, гаралтын утгыг хүлээн авах боломжтой
Сүүлийнх нь баримт бичигт тодорхой тусгаагүй тул зарим жишээг энд оруулав

Энэ жишээнд 4 хувьсагчийг динамик хүсэлт рүү дамжуулж байгаагийн гурав нь гаралт болно

@var1 int , @var2 varchar ( 100 ), @var3 varchar ( 100 ), @var4 int зарлах @mysql nvarchar ( 4000 ) @mysql = тохируулна уу "set @var1 = @var1 + @var4; тохируулах @var2 = ""CCCC" "; @var3 = @var3 + " "dddd" "" тохируулах @var1 = 0 @var2 = "BBBB" багц @var3 = "AAAA" багц @var4 = 10 @var1, @var2, @var3 exec sp_executesql @mysql, N-г сонгоно уу. "@var1 int out, @var2 varchar(100) out, @var3 varchar(100) out, @var4 int", @var1 = @var1 гарч, @var2 = @var2 гарч, @var3 = @var3 гарч, @var4 = @var4 @var1, @var2, @var3-ыг сонгоно уу.

Энэ жишээнд курсорыг динамик асуулгад нээсэн бөгөөд энэ нь дуудлагын горимд гаралтын хувьсагчаар дамжуулан хандах боломжтой.

USE пабууд @cur cursor exec sp_executesql N зарладаг " @curvar нээлттэй зохиогчоос шилдэг 10 au_id, au_lname, au_fname сонгохын тулд орон нутгийн курсорыг тохируулах", N"@curvar курсорын гаралт " , @curvar=@cur output FETCH NEXT FROM @cur WHILE WHILE @@FETCH_STATUS = 0 @cur END-с ДАРААХ АВАХ

Анкет (заавал тавигдах шаардлагаас илүү IMHO)
Динамик асуулга нь маш хэрэгтэй бөгөөд заримдаа орлуулшгүй зүйл боловч түүнийг хэрэгжүүлэх аргууд, тухайлбал процедурыг дуудсан хэрэглэгчийн эрх бүхий тусдаа багц дахь дуудлагаар дамжуулан түүний практик MASS хэрэглээг бууруулдаг.

Microsoft SQL Server нь TABLE тусгай төрлийн өгөгдлийн төрөлтэй бөгөөд үүнд үндэслэн бид хийх боломжтой хүснэгтийн хувьсагч үүсгэх, тэдгээрийг заавар, журамдаа ашиглахын тулд өнөөдөр бид эдгээр хувьсагчдыг авч үзэх, тэдгээрийг хэрхэн зарласан, эдгээр хувьсагчдад ямар онцлог шинж чанартай болохыг олж мэдэх болно.

MS SQL Server хүснэгтийн хувьсагчдын тайлбар

Хүснэгтийн хувьсагчидХүснэгтийн мөр хэлбэрээр үүссэн өгөгдлийн багцыг түр хадгалахад ашигладаг тусгай TABLE өгөгдлийн төрөл бүхий хувьсагчууд юм. Тэд SQL серверийн 2005 оны хувилбар дээр гарч ирсэн. Та ийм хувьсагчдыг хадгалагдсан процедур, функц, триггер болон ердийн SQL багцад ашиглаж болно. Хүснэгтийн хувьсагчдыг DECLARE хэллэгээр зарлах замаар ердийн хувьсагчтай ижил аргаар үүсгэнэ.

Энэ төрлийн хувьсагч нь түр зуурын хүснэгтүүдийн өөр хувилбар болно. Хэрэв бид хүснэгтийн хувьсагч эсвэл түр зуурын хүснэгтийг ашиглах нь дээр гэж ярих юм бол тодорхой хариулт байхгүй, хүснэгтийн хувьсагчид эерэг болон сул талуудтай байдаг. Жишээлбэл, би хувьдаа хүснэгтийн хувьсагчдыг ашиглах дуртай, учир нь тэдгээрийг үүсгэхэд тохиромжтой ( тэдгээр. зарлах) бөгөөд зааврын төгсгөлд тэдгээрийг арилгах эсвэл арилгах талаар бодох шаардлагагүй, учир нь тэдгээр нь автоматаар арилдаг ( ердийн хувьсагчтай адил). Гэхдээ үүний зэрэгцээ хүснэгтийн хувьсагчдыг зөвхөн бага хэмжээний өгөгдөл хадгалах гэж байгаа үед ашиглах нь дээр, эс тэгвээс түр зуурын хүснэгтүүдийг ашиглахыг зөвлөж байна.

Microsoft SQL Server дээрх хүснэгтийн хувьсагчийн ашиг тус

  • Хүснэгтийн хувьсагч нь орон нутгийн хувьсагч шиг ажилладаг. Тэд нарийн тодорхойлогдсон хэрэглээний талбартай;
  • Хүснэгтийн хувьсагчдыг тодорхойлсон мэдэгдлийн төгсгөлд автоматаар арилгадаг;
  • Хадгалсан горимд хүснэгтийн хувьсагчдыг ашиглах үед түр зуурын хүснэгтүүдийг ашиглахаас бага давтамжтайгаар дахин эмхэтгэдэг;
  • TABLE хувьсагчийг ашиглан гүйлгээ нь зөвхөн харгалзах хувьсагчийг шинэчлэх үед л үргэлжилнэ. Үүнээс шалтгаалан хүснэгтийн хувьсагчид түгжигдэх магадлал багатай бөгөөд бүртгэл хөтлөхөд бага нөөц шаардагдана.

MS SQL сервер дэх хүснэгтийн хувьсагчийн сул талууд

  • TABLE хувьсагчдыг өөрчилсөн асуулга нь зэрэгцээ асуулгын төлөвлөгөө үүсгэдэггүй;
  • TABLE хувьсагчид түгээлтийн статистик байхгүй бөгөөд дахин эмхэтгэлийг өдөөдөггүй тул тэдгээрийг цөөн тооны мөрөнд ашиглахыг зөвлөж байна;
  • Хүснэгтийн хувьсагчийг үүсгэсний дараа өөрчлөх боломжгүй;
  • SELECT INTO мэдэгдлийг ашиглан хүснэгтийн хувьсагчийг үүсгэх боломжгүй;
  • TABLE хувьсагч нь гүйлгээг буцаах үед өөрчлөгддөггүй, учир нь тэдгээр нь хязгаарлагдмал хамрах хүрээтэй бөгөөд байнгын мэдээллийн сангийн нэг хэсэг биш юм.

Microsoft SQL Server дээр хүснэгтийн хувьсагчдыг ашиглах жишээ

Одоо дадлагадаа шилжье, эхлээд миний сервер бол Microsoft SQL Server 2016 Express, өөрөөр хэлбэл доорх бүх асуултууд нь DBMS-ийн энэ хувилбар дээр хийгдсэн гэдгийг тэмдэглэхийг хүсч байна.

Эхлээд тестийн хүснэгт үүсгээд түүнийг тестийн өгөгдлөөр дүүргэж хүснэгтийн хувьсагчдыг ердийн хүснэгтэд хэрхэн ашиглаж болохыг харцгаая.

CREATE TABLE TestTable(ProductId INT IDENTITY(1,1) NOT NULL, ProductName VARCHAR(50) NULL CONSTRAINT PK_TestTable АНХДАГЧ ТҮЛХҮҮР БАГЛАСАН (ProductId ASC)) Тестийн Хүснэгт (Бүтээгдэхүүний нэр) VALUES ("Computer") ОРУУЛАХ ("Computer)," , ("Хэвлэгч") Туршилтын Хүснэгтээс СОНГОХ * ГАРНА


Би 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.Price FROM @TableVar TVar ЗҮҮН НЭГДСЭН Туршилтын Хүснэгт TT Хүснэгт ON TVar.ProductId = TTable.ProductId


Анхдагч түлхүүр, ӨГӨГДӨЛ хязгаарлалт, кластергүй индекс бүхий хүснэгтийн хувьсагчийг үүсгэх

Энэ жишээ нь хүснэгтийн хувьсагчид дээр анхдагч түлхүүр, UNIQUE хязгаарлалт, кластергүй индексийг хэрхэн үүсгэж болохыг харуулж байна. Кластерт бус индекс үүсгэх чадвар нь Microsoft SQL Server 2014-ээс хойш боломжтой болсон.

Хүснэгтийн хувьсагчийн мэдэгдэл DECLARE @TableVar TABLE(ProductId INT NULL НЭГДСЭН АНХДАГЧ ТҮЛХҮҮР, --Үндсэн түлхүүр Бүтээгдэхүүний нэр VARCHAR(50) NULL БУС, Үнэ MONEY NULL БУС, UNICE (Бүтээгдэхүүний нэр, Үнэ), --Хязгаарлалтын INDEX IX_ХҮСНЭГТТЭЙ- Кластерт бус индекс); --Хүснэгтийн хувьсагчид өгөгдөл нэмэх INSERT INTO @TableVar (ProductId, ProductName, Price) VALUES (1, "Компьютер", 500), (2, "Monitor", 300), (3, "Хэвлэгч", 200); --Өгөгдлийн сонголт Бүтээгдэхүүний нэрийг @TableVar-аас СОНГООРОЙ Үнэ > 200


Хүснэгтийн хувьсагчдын тухай миний түүхийг үүгээр дуусгаж байна, хэрэв та T-SQL хэлийг нарийвчлан судлахыг хүсвэл "T-SQL програмистын арга зам" номоо уншихыг зөвлөж байна, материал танд хэрэг болсон гэж найдаж байна, баяртай!

Хувьсах утгыг тохируулах

Одоогийн байдлаар SQL хэл нь хувьсагчийн утгыг тохируулах хоёр аргыг санал болгодог - энэ зорилгоор та SELECT эсвэл SET мэдэгдлийг ашиглаж болно. Функциональ байдлын хувьд эдгээр мэдэгдлүүд нь бараг адилхан ажилладаг бөгөөд зөвхөн SELECT мэдэгдэл нь SELECT мэдэгдэлд заасан хүснэгтээс анхны даалгаврын утгыг олж авах боломжийг олгодог.

SET хэллэгийг ихэвчлэн процедурын хэлэнд илүү түгээмэл хэлбэрээр хувьсагчийн утгыг тохируулахад ашигладаг. Энэ операторыг ашиглах ердийн жишээнд дараахь зүйлс орно.

SET @b = @a * 1.5

Эдгээр бүх мэдэгдлүүд нь тодорхой утгууд эсвэл бусад хувьсагчдыг ашиглан шууд хуваарилах үйлдлийг гүйцэтгэдэг болохыг анхаарна уу. Асуулгаар олж авсан хувьсагчид утга оноохын тулд та SET мэдэгдлийг ашиглах боломжгүй; хүсэлтийг тусад нь гүйцэтгэх ёстой бөгөөд зөвхөн үүний дараа гарсан үр дүнг SET мэдэгдлийг ашиглан оноож болно. Жишээлбэл, ийм мэдэгдлийг гүйцэтгэх оролдлого нь алдаа үүсгэдэг:

Хотоос @c = COUNT(*) ТОГТООХ

Дараах мэдэгдэл нэлээд амжилттай хэрэгжиж байна:

SET @c = (Хотоос COUNT(*) СОНГОХ)

SELECT хэллэг нь хувьсагчид хадгалагдах мэдээллийн эх сурвалж нь асуулга байх үед хувьсагчид утга оноохдоо ихэвчлэн ашиглагддаг. Жишээлбэл, дээрх кодонд гүйцэтгэсэн үйлдлүүд нь SELECT мэдэгдлийг ашиглан илүү түгээмэл хэрэгждэг:

Хотоос @c = COUNT(*) СОНГОХ

Энэ код нь бага зэрэг тодорхой гэдгийг анхаарна уу (ялангуяа энэ нь ижил зүйлийг хийдэг ч гэсэн илүү товч юм).

Тиймээс хоёр операторыг ашиглахад дараах нийтээр хүлээн зөвшөөрөгдсөн конвенцийг томъёолох боломжтой.

SET хэллэгийг энгийн хувьсагч хуваарилах үйлдлийг гүйцэтгэх үед ашигладаг, өөрөөр хэлбэл. хэрэв оноож буй утгыг аль хэдийн тодорхой утгын хэлбэрээр эсвэл өөр хувьсагчийн хэлбэрээр тодорхой өгсөн бол.

SELECT хэллэгийг хувьсагчид утга оноох нь асуулгад тулгуурласан байх ёстой үед хэрэглэгддэг.

SQL асуулгад хувьсагч ашиглах

T-SQL-ийн ашигтай шинж чанаруудын нэг нь хувьсагчдыг програмын кодонд оруулах нарийн төвөгтэй динамик мөрүүдийг үүсгэх шаардлагагүйгээр асуулгад ашиглах боломжтой байдаг. Динамик SQL оршсоор байгаа боловч хувьсагч ашиглан нэг утгыг илүү хялбараар өөрчлөх боломжтой.

Асуулгад илэрхийлэл ашиглаж болох газар бүрт хувьсагчийг мөн ашиглаж болно. Дараах жишээ нь WHERE заалт дахь хувьсагчийн хэрэглээг харуулж байна:

@IdProd int;

SET @IdProd = 1;

СОНГОХ

Энэ материалыг бид авч үзэх болно T-SQL хэл дээрх програмчлалын үндэс, бид энэ нь ямар хэл болохыг, ямар үндсэн чадвартай, ямар бүтэцтэй болохыг олж мэдэх бөгөөд мэдээжийн хэрэг, энэ бүхний явцад би кодын жишээ өгөх болно.

Энэ сайт дээр та бид хоёр аль хэдийн SQL хэл, ялангуяа түүний Transact-SQL өргөтгөл дээр нэлээд олон материалыг зориулж байгаа гэдгээс эхэлмээр байна. T-SQL гэдэг нь Transact-SQL-ийн товчлол гэдгийг та хэрхэн ойлгох вэ?). Мөн бид энэ хэл дээр эхлэгчдэд зориулсан жижиг гарын авлагыг эмхэтгэсэн бөгөөд мэдээжийн хэрэг олон жишээг үзсэн боловч T-SQL програмчлалын хувьд, жишээлбэл, хувьсагчид, нөхцөлт бүтэц, тайлбарууд дээр бид анхаарлаа хандуулсан боловч анхаарлаа хандуулаагүй. Энэ талаар. Гэхдээ бид эхлэгч програмистуудад зориулсан сайттай тул би энэ материалыг эдгээр үндсэн ойлголтуудад зориулахаар шийдсэн.

T-SQL програмчлалын хэл

Transact-SQL (T-SQL) нь Microsoft-ын SQL хэлний өргөтгөл бөгөөд SQL Server-д өгөгдлийн сангийн програмчлалд ашиглагддаг.

SQL Server нь ANSI стандартын SQL хэлний чадавхийг өргөтгөх олон бүтэц, бүрэлдэхүүн хэсэг, функцуудыг агуулдаг бөгөөд үүнд ердийн асуулга бичихээс ялгаатай сонгодог програмчлал орно.

Өнөөдөр бид тодорхой функцийг хэрэгжүүлэхийн тулд код бичихийг багтаасан T-SQL хэлний үндсэн хэсгийг авч үзэх болно ( жишээ нь процедур эсвэл функцэд), зөвхөн зарим мэдээллийн сангийн асуулга биш.

T-SQL дахь хувьсагчид

Мөн бид хувьсагчдаас эхлэх болно, тэдгээр нь түр зуурын өгөгдлийг хадгалахын тулд хэсэг хугацаанд хадгалах, дараа нь ашиглахад шаардлагатай байдаг.

T-SQL-д орон нутгийн болон глобал гэсэн хоёр төрлийн хувьсагч байдаг. Локал хувьсагч нь зөвхөн үүсгэгдсэн сесс дотор л байдаг бол глобал хувьсагчдыг SQL серверийн талаарх мэдээлэл эсвэл өгөгдлийн сангийн зарим өөрчлөгдөж буй мэдээллийг олж авахад ашигладаг.

Орон нутгийн хувьсагчдыг түлхүүр үг ашиглан зарладаг МЭДЭГДЭХмөн тэмдгээр эхэл @ . Олон програмчлалын хэлнүүдийн нэгэн адил T-SQL-ийн хувьсагч нь тодорхой өгөгдлийн төрөлтэй байх ёстой. SQL серверт маш олон өгөгдлийн төрлүүд байдаг бөгөөд бид тэдгээрийг дээр дурдсан лавлах номонд нарийвчлан судалсан.

Та хувьсагчид утга оноохдоо командуудыг ашиглаж болно SETэсвэл Сонго.

Өмнө нь хэлсэнчлэн сервер эсвэл өгөгдлийн сангийн талаар ямар нэгэн мэдээлэл авахын тулд глобал хувьсагчид хэрэгтэй, жишээлбэл, SQL Server дахь глобал хувьсагчид:

  • @@ROWCOUNT – өмнөх тушаалаар боловсруулсан бичлэгийн тоог хадгална;
  • @@ERROR – сүүлчийн командын алдааны кодыг буцаана;
  • @@SERVERNAME — дотоод SQL серверийн нэр;
  • @@VERSION - SQL Server хувилбарын дугаар;
  • @@IDENTITY нь оруулах үйлдэлд ашигласан сүүлчийн тоолуурын утга юм ( оруулах).

Одоо жишээ болгон INT төрлийн өгөгдлийн хоёр хувьсагч үүсгэж, тэдэнд утгыг оноож, эхнийх нь SET командыг, хоёр дахь нь Select командыг ашиглан эдгээр утгыг зүгээр л харуулан, мөн утгыг хэвлэцгээе. @@VERSION хувьсагч, өөрөөр хэлбэл . SQL серверийн хувилбарыг олж мэдээрэй.

DECLARE @TestVar1 INT DECLARE @TestVar2 INT SET @TestVar1 = 1 СОНГОХ @TestVar2 = 2 @TestVar1-ийг [Хувьсагч 1], @TestVar2-г [Хувьсагч 2], @@VERSION-г [SQL Серверийн хувилбар]

Багцууд

T-SQL дэх багц- Эдгээр нь нэг бүлэгт нэгтгэгдсэн SQL командууд эсвэл хэллэгүүд бөгөөд SQL сервер нь тэдгээрийг бүхэлд нь эмхэтгэн гүйцэтгэх болно.

SQL серверт багц команд дамжуулж байгаагаа ойлгуулахын тулд та түлхүүр үгийг зааж өгөх ёстой. ЯВбагц болгон нэгтгэхийг хүссэн бүх командын дараа.

Орон нутгийн хувьсагч нь зөвхөн үүсгэсэн багц дотор харагдах болно, өөрөөр хэлбэл. Багц дууссаны дараа та хувьсагчид хандах боломжгүй болно.

Хэрэв бидний дээр дурдсан жишээг багц болгон нэгтгэж, дараа нь хувьсагчдын утгыг авахыг оролдвол бид дараахь зүйлийг авна гэж бодъё.


Тэдгээр. @TestVar1 хувьсагчийг зарлаагүйгээс алдаа гарсныг бид харж байна.

Нөхцөл байдал

Эдгээр бүтээн байгуулалтууд нь салаалсан, өөрөөр хэлбэл. Тодорхой нөхцөл хангагдсан эсэхээс хамаарч T-SQL хэллэгүүд чиглэлээ өөрчилнө.

ХЭРВЭЭ…ӨӨР БОЛ

Энэ бүтэц нь бүх програмчлалын хэл дээр байдаг бөгөөд энэ нь нөхцөл хангагдсан эсэхийг шалгах бөгөөд хэрэв бүх шалгалтыг давсан бол дараах тушаалыг гүйцэтгэнэ, үгүй ​​бол юу ч гүйцэтгэгдэхгүй, гэхдээ та ELSE түлхүүр үгийг зааж өгч болно. энэ тохиолдолд заасан операторууд энэ үгийн дараа ажиллана.

DECLARE @TestVar1 INT DECLARE @TestVar2 VARCHAR(20) SET @TestVar1 = 5 IF @TestVar1 > 0 SET @TestVar2 = "0-ээс их" БУСДАА SET @TestVar2 = "0-ээс бага" @TestVar2-г СОНГОХ [ASTVar2]

БАЙГАА БОЛ

Энэ бүтэц нь нөхцөлөөр тодорхойлсон бүртгэл байгаа эсэхийг тодорхойлох боломжийг танд олгоно. Жишээлбэл, бид хүснэгтэд тодорхой бичлэг байгаа эсэхийг мэдэхийг хүсч байгаа бөгөөд эхний тохирол илэрсэн үед командын боловсруулалт зогсдог. Энэ нь үндсэндээ COUNT(*) > 0-тэй ижил байна.

Жишээлбэл, бид test_table хүснэгтэд id утга >=0 байгаа бичлэг байгаа эсэхийг шалгахыг хүсэж байгаа бөгөөд үүн дээр үндэслэн бид хэрхэн үргэлжлүүлэхээ шийдэх болно.


DECLARE @TestVar VARCHAR(20) IF EXISST (СОНГОХ * FROM test_table WHERE id > = 0) SET @TestVar = "Бичлэгүүд байгаа" ELSE SET @TestVar = "Ямар ч бүртгэл байхгүй" SELECT @TestVar AS [Бичлэгүүд байгаа]

CASE

Энэ бүтээцийг сонгох хэллэгтэй хамт ашигладаг бөгөөд IF бүтцийг дахин ашиглахыг орлох зорилготой. Энэ нь хувьсагчийг шалгах шаардлагатай тохиолдолд хэрэг болно ( эсвэл талбай) тодорхой утгууд байгаа эсэх.


DECLARE @TestVar1 INT DECLARE @TestVar2 VARCHAR(20) SET @TestVar1 = 1 СОНГОХ @TestVar2 = CASE @TestVar1 ХЭЗЭЭ 1 ДАРАА 2-Т "Нэг" Дараа нь "Хоёр" ӨСГӨ "Тодорхойгүй" ТӨГСГӨЛ @TestVar2 [TestVar]

ЭХЛЭХ... ТӨГСГӨЛ

Энэ бүтэц нь командын блок үүсгэхэд зайлшгүй шаардлагатай, i.e. жишээ нь, хэрэв бид IF блокийн дараа нэг командыг биш хэд хэдэн командыг гүйцэтгэхийг хүсвэл BEGIN...END блок дотор бүх командыг бичих хэрэгтэй болно.

Өмнөх жишээгээ өөрчилье ( ОРШИГДОЛТОЙ бол тухай) ингэснээр test_table хүснэгтэд id > = 0 гэсэн бичлэг байгаа бол @TestVar хувьсагчид утга оноохоос гадна бид шинэчлэлт хийх болно. ижил хүснэгтийн зарим өгөгдлийг шинэчлэх, мөн @@ROWCOUNT глобал хувьсагчийг ашиглан шинэчилсэн мөрийн тоог харуулах.


DECLARE @TestVar1 VARCHAR(20) DECLARE @TestVar2 INT SET @TestVar2 = 0 IF EXISST (СОНГОХ * test_table-аас ХААНА id > = 0) BEGIN SET @TestVar1 = "Бүртгэлүүд байгаа" ШИНЭЧЛЭХ test_table SET багана1 = 5 WHER SET = >0 @TestVar2 = @@ROWCOUNT ТӨГСГӨЛӨӨ @TestVar1 = "Бичлэг байхгүй" @TestVar1 AS [Бичлэгүүд байгаа], @TestVar2 AS [Мөрүүдэд нөлөөлсөн:]

T-SQL гогцоонууд

Хэрэв бид гогцоонуудын талаар ерөнхийд нь ярих юм бол тэдгээр нь тушаалын гүйцэтгэлийг олон удаа давтах шаардлагатай байдаг. T-SQL-д нэг давталт байдаг WHILE урьдчилсан нөхцөлтэй, энэ нь давталт эхлэхээс өмнөх нөхцөл хангагдсан тохиолдолд командууд эхлэх бөгөөд давтагдах болно гэсэн үг бөгөөд мөн давталтын гүйцэтгэлийг түлхүүр үгсээр удирдаж болно. BREAKТэгээд ҮРГЭЛЖЛҮҮЛЭХ.


@Cnt INT = 1, @result INT = 0, @CountRow INT SELECT @CountRow = COUNT(*) тестийн_хүснэгтээс @Cnt-г МЭДЭГДЭХ.<= @CountRow BEGIN SET @Cnt += 1 SET @result += 1 IF @Cnt = 20 BREAK ELSE CONTINUE END SELECT @result AS [Количество выполнений цикла:]

Энэ жишээн дээр бид эхлээд мэдээж хувьсагчдыг зарлана ( Бид Cnt-ийг нэн даруй эхлүүлж, үр дүнд нь SQL Server 2008-аас эхлэн хувьсагчийн утгыг тохируулах боломжтой.). Дараа нь бид хүснэгтийн тест_хүснэгтэнд хэдэн мөр байгааг олж мэдээд дараа нь хүснэгтийн мөрийн тоо манай тоолуураас их эсвэл тэнцүү эсэхийг шалгаад туршилтын гогцоонд орно. Гогцоонд бид тоолуурын утгыг нэмэгдүүлж, үр дүнг бичиж, дахин шалгана, хэрэв манай тоолуур аль хэдийн 20-д хүрсэн бол бид үүнийг дуусгахыг албадах болно, үгүй ​​бол тоолуурын утга түүнээс их буюу тэнцүү болтол үргэлжлүүлнэ. Хүснэгтийн мөрийн тоо хүртэл эсвэл хүснэгтэд илүү олон мөр байгаа бол 20 хүртэл.

Сэтгэгдэл

Тэд кодыг тайлбарлаж, тэмдэглэл хөтлөхөд шаардлагатай байдаг, учир нь хэрэв код нь том бөгөөд төвөгтэй байвал хэсэг хугацааны дараа та яг яагаад энэ юм бэ, яагаад кодын энэ эсвэл тэр хэсгийг бичсэнээ мартаж магадгүй юм. T-SQL-д нэг мөр (-Текст) болон олон мөрт тайлбар (/*Текст*/) байдаг.


T-SQL командууд

РУУ ЯВАХ

Энэ командыг ашигласнаар та кодоор тодорхой шошго руу шилжих боломжтой. Жишээлбэл, та ямар нэгэн гогцоо хийхийг хүссэн үедээ ашиглаж болно, гэхдээ while байхгүй.


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

ХҮЛЭЭХ

Команд нь тодорхой хугацаанд эсвэл тодорхой хугацаа хүртэл кодын гүйцэтгэлийг түр зогсоож болно. Параметр ХОЁРОЛТөгөгдсөн урттай завсарлага хийдэг ба ЦАГзаасан хугацаа хүртэл процессыг түр зогсооно. Параметрийн утгыг форматаар зааж өгсөн болно hh:mi:ss


DECLARE @TimeStart time, @TimeEnd time SET @TimeStart = ХӨРВҮҮЛЭХ (цаг, GETDATE())--ХҮЛЭЭЛГЭЭНИЙ ХОООРОЛТ "00:00:05" цагийг олоорой--5 секундын турш түр зогсооно TET @TimeEnd = ХӨРӨВЛҮҮЛЭХ (цаг, GETDATE) ()) )--Цаг хугацааг дахин олж мэдээрэй --Хэдэн секундын дотор хичнээн цаг өнгөрснийг олж мэдээрэй DATEDIFF(ss, @TimeStart, @TimeEnd) AS [Seconds Passed:]

БУЦАХ

Энэ команд нь асуулга эсвэл процедураас болзолгүйгээр гарахад ашиглагддаг. RETURN-ийг процедур, багц эсвэл мэдэгдлийн блокоос гарахын тулд аль ч үед ашиглаж болно. Энэ тушаалын дараа ирэх бүх зүйл биелэгдэхгүй.


DECLARE @Cnt INT = 1, @result varchar(15) /*Хэрэв Cnt-ийн утга 0-ээс бага бол дараах командууд ажиллахгүй бөгөөд [Үр дүн:] баганыг харахгүй*/ IF @Cnt< 0 RETURN SET @result = "Cnt больше 0" SELECT @result AS [Результат:]

ХЭВЛЭХ

Үйлчилгээний мессеж илгээхийн тулд та тушаалыг ашиглаж болно ХЭВЛЭХ. Management Studio дээр энэ зурвас Мессеж таб дээр гарч ирнэ ( Мессежүүд).


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

Гүйлгээ

Гүйлгээнь амжилттай дуусгах эсвэл бүхэлд нь цуцалсан тушаал эсвэл командын блок юм. Өөрөөр хэлбэл, хэрэв гүйлгээний доторх нэг тушаал эсвэл заавар амжилтгүй болвол өмнөх командууд амжилттай хийгдсэн байсан ч өмнө нь боловсруулсан бүх зүйл хүчингүй болно.

Энэ механизм нь мэдээллийн бүрэн бүтэн байдлыг хангахад зайлшгүй шаардлагатай, i.e. Нэг данснаас нөгөө данс руу мөнгө шилжүүлдэг журамтай гэж бодъё, гэхдээ данснаас мөнгө авсан ч өөр дансанд орж ирээгүй нөхцөл байдал үүсч магадгүй. Жишээлбэл, мөнгө авах SQL заавар ажиллаж байсан боловч мөнгө байршуулсан зааврыг гүйцэтгэх үед алдаа гарсан, өөрөөр хэлбэл мөнгө татагдаж, зүгээр л алдагдсан. Үүнээс урьдчилан сэргийлэхийн тулд бүх SQL мэдэгдлүүд нь гүйлгээний дотор бичигдсэн байдаг бөгөөд хэрэв ийм нөхцөл байдал үүсвэл бүх өөрчлөлтүүд цуцлагдах болно, i.e. мөнгө таны дансанд буцаж ирнэ.

Хүснэгтээс бидэнд юу байгааг олж мэд (id = IDENTITY) Тестийн_хүснэгтээс СОНГОХ --Гүйлгээг эхлүүлнэ EEGIN TRAN --Эхлээд бүх өгөгдлийг шинэчил. Test_table SET багана1 = багана1 - 5 --Дараа нь шинэ утгууд бүхий мөрүүдийг нэмнэ үү. INSERT INTO test_table SELECT column1 FROM test_table --Хэрэв алдаа гарсан бол бүгдийг цуцал IF @@error != 0 ЭХЛҮҮЛЭХ БУЦАХ ТРАН БУЦАХ END COMMIT TRAN -- Юу болсныг харцгаая SELECT * FROM test_table

Энэ жишээнд хэрэв өгөгдөл нэмэх үед алдаа гарсан бол (INSERT) UPDATE цуцлагдах болно.

Алдаа боловсруулах - TRY...CATCH бүтэц

T-SQL кодыг гүйцэтгэх явцад гэнэтийн нөхцөл байдал үүсч болзошгүй, жишээлбэл. шийдвэрлэх шаардлагатай алдаа. SQL серверт SQL Server 2005-аас эхлэн ийм бүтэц байдаг ҮЗЭЭРЭЙ...БАРЬ, энэ нь алдааг хянах боломжтой.


BEGIN TRY DECLARE @TestVar1 INT = 10, @TestVar2 INT = 0, @result INT SET @result = @TestVar1 / @TestVar2 ТӨГСГӨЛ СОНГОХ ERROR_NUMBER()-г [Алдааны дугаар], ERROR_ASSEEND() тайлбар () ГАРЧ ЭХЭЛНЭ ҮҮ CATCH

Энэ жишээнд тэгээр хуваагдах нөхцөл байдал үүссэн ( Та бүхний мэдэж байгаагаар 0-д хувааж болохгүй) мөн бидний кодын блокыг TRY бүтцэд байрлуулсан тул алдааны дугаар болон түүний тайлбарыг л авдаг онцгой тохиолдол гарсан.

Энэ нь үндсэн ойлголтод хангалттай гэж бодож байна, хэрэв та T-SQL хэлний бүх бүтцийг илүү нарийвчлан судлахыг хүсч байвал T-SQL хэлний талаар аль хэдийн хэлэлцсэн "T-SQL програмистын арга" номыг уншихыг зөвлөж байна. илүү дэлгэрэнгүй, энэ бол миний хувьд, амжилт хүсье!

Би өөр өөр мэдээллийн сангаас өөр өөр асуулгад ижил утгыг ашиглахыг хүсч байна

DECLARE @GLOBAL_VAR_1 INT = Утга_1 МЭДЭГДЭХ @GLOBAL_VAR_2 INT = Утга_2 "DB_1"-г АШИГЛАХ "ХҮСНЭГТ"-ээс СОНГОХ * "COL_!" = @GLOBAL_VAR_1 БА "COL_2" = @GLOBAL_VAR_2 "DB_2"-г АШИГЛАХ "ХҮСНЭГТ"-с "COL_!" = @GLOBAL_VAR_2

гэхдээ алдаа гаргадаг.

Та "@GLOBAL_VAR_2" скаляр хувьсагчийг зарлах ёстой.

Хэн нэгэн үүнийг хийх арга замыг санал болгож чадах уу ...?

11 хариулт

Transact-SQL-д глобал хувьсагчийг зарлах боломжгүй. Гэсэн хэдий ч, хэрэв таны хүссэн зүйл бол хувьсагчдаа нэг скриптийн багцад ашиглах боломжтой бол та уг хэрэгслийг ашиглаж болно. SQLCMDэсвэл SQLCMD горим SSMS болон энэ хэрэгсэл/горимоос хамааралтай хувьсагчдыг тодорхойлох, жишээлбэл:

:setvar myvar 10

Дараа нь тэдгээрийг дараах байдлаар ашигла:

$(myvar)

SQLCMD-ийн SSQ горимыг ашиглахын тулд:

Та чи чадахгүй SQLServer дээр глобал хувьсагчдыг зарлах.

Хэрэв та Management Studio ашиглаж байгаа бол @Lanorkin-ийн дурдсанчлан SQLCMD горимыг ашиглаж болно.

Үгүй бол та сесс болон холболтын үед харагдах нэг хувьсагчийг хадгалахын тулд CONTEXT_INFO ашиглаж болох боловч дараа нь алга болно.

Жинхэнэ даяаршсан цорын ганц арга бол дэлхийн түр зуурын хүснэгтийг (##таныХүснэгтНэр нэртэй) үүсгэж, тэнд хувьсагчаа хадгалах боловч бүх холболт хаагдсан үед энэ нь мөн алга болно.

Та глобал хүснэгтийг туршиж үзэж болно:

Хүснэгт үүсгэх ##global_var (var1 int ,var2 int) "DB_1"-г АШИГЛАХ "ХҮСНЭГТ"-с "COL_!" = (##global_var-аас var1-г сонгоно уу) БА "COL_2" = @GLOBAL_VAR_2 "DB_2"-г АШИГЛАХ "ХҮСНЭГТ"-с "COL_!" = (##global_var-аас var2-г сонгоно уу)

Энэ жишээнд алдаа нь ашиглалтын мэдэгдлийн дараах GO-той холбоотой байна. GO мэдэгдэл нь орчныг дахин тохируулдаг тул хэрэглэгчийн хувьсагч байхгүй болно. Тэднийг дахин зарлах ёстой. Глобал хувьсагчийн тухай асуултын хариулт нь Үгүй ээ, ямар ч глобал хувьсагч байхгүй, ядаж 2008 онтой тэнцэх буюу түүнээс өмнөх Sql серверийн хувилбарууд. Би SQL Server-ийн шинэ хувилбаруудын хувьд ижил баталгаа өгч чадахгүй.

Хүндэтгэсэн, HINI

SQL Server 2016-аас эхлэн сесс дотор мэдээлэл хуваалцах шинэ аргыг нэвтрүүлсэн SESSION_CONTEXTболон sp_set_session_context .

Та тэдгээрийг зөвхөн 128 байтаар хязгаарлагдмал хоёртын утгыг хадгалдаг CONTEXT_INFO()-ын өөр хувилбар болгон ашиглаж болно. Мөн хэрэглэгч хүссэн үедээ утгыг дарж бичих боломжтой бөгөөд үүнийг аюулгүй байдлын туршилтанд ашиглах нь тийм ч сайн санаа биш юм.

Дараах асуудлуудыг шинэ хэрэгслүүдийг ашиглан шийддэг. Та өгөгдлийг илүү хэрэглэгчдэд ээлтэй форматаар хадгалах боломжтой:

EXEC sp_set_session_context "хэл", "Англи"; СОНГОХ SESSION_CONTEXT(N "хэл");

Нэмж хэлэхэд бид үүнийг зөвхөн унших боломжтой гэж тэмдэглэж болно:

EXEC sp_set_session_context "user_id", 4, @read_only = 1;

Хэрэв та зөвхөн уншигдах сессийн контекстийг өөрчлөхийг оролдвол дараахь зүйлийг авах болно.

Мессеж 15664, Түвшин 16, төлөв 1, sp_set_session_context, 10-р мөрөнд 'user_id' түлхүүрийг сессийн контекстэд тохируулах боломжгүй. Энэ сессийн хувьд түлхүүрийг аль болох хурдан суулгасан.

Ашиглаж үзнэ үү; GO-ийн оронд. Энэ нь надад 2008 оны R2 хувилбар дээр ажилласан

DECLARE @GLOBAL_VAR_1 INT = Утга_1; DECLARE @GLOBAL_VAR_2 INT = Утга_2; "DB_1" ашиглах; "ХҮСНЭГТ"-с "COL_!" = @GLOBAL_VAR_1 БА "COL_2" = @GLOBAL_VAR_2; "DB_2" ашиглах; "ХҮСНЭГТ"-с "COL_!" = @GLOBAL_VAR_2;

Хувьсагчийн утгыг буцаадаг скаляр функцийг үүсгэснээр ижил төстэй үр дүнд хүрч болно. Мэдээжийн хэрэг, хэрэв та олон тооны үр дүн өгдөг асуулгад ашигладаг бол функцийн дуудлагууд үнэтэй байж болох ч үр дүнгийн багцыг хязгаарлавал зүгээр байх болно. Энд би зөвхөн эдгээр хагас статик утгыг хадгалахын тулд үүсгэсэн мэдээллийн санг ашиглаж байна, гэхдээ та тэдгээрийг мэдээллийн сан бүрээр үүсгэж болно. Таны харж байгаагаар энд ямар ч оролтын хувьсагч байхгүй, зүгээр л сайн нэртэй функц нь статик утгыг буцаадаг: хэрэв та тухайн функцийн утгыг өөрчилбөл хаана ч ашигласан (дараагийн удаа дуудах үед) тэр даруй өөрчлөгдөх болно. >

GO CREATE ФУНКЦИЙГ АШИГЛАВ Төгсгөл -- Хэрэглээ: СОНГОХ " ..." -- Үр дүн: ...



ХОНХ

Энэ мэдээг чамаас өмнө уншсан хүмүүс бий.
Шинэ нийтлэлүүдийг хүлээн авахын тулд бүртгүүлээрэй.
Имэйл
Нэр
Овог
Та Хонхыг хэрхэн уншихыг хүсч байна вэ?
Спам байхгүй