Kontakty

Priraďte hodnotu v SQL dotazu. Základy programovania na T-SQL. Pomocou funkcií na prácu s premennými reťazcami

Chcem použiť rovnakú hodnotu pre rôzne požiadavky z rôznych databáz.

Deklarovanie @ global_var_1 Int \u003d hodnota_1 deklarovanie @ global_var_2 int \u003d hodnota_2 Použite "DB_1" Go Select * z "Tabuľka", kde "Col_!" \u003d @ Global_var_1 a "col_2" \u003d @ global_var_2 Použite "DB_2" Go Select * z "Tabuľka", kde "Col_!" \u003d @ Global_var_2.

ale to dáva chybu.

Je potrebné vyhlásiť skalárovú premennú "@ global_var_2".

Môže niekto ponúknuť akýkoľvek spôsob, ako to urobiť ...?

11 odpovedí

Nepodarilo sa oznámiť globálnu premennú v Transact-SQL. Avšak, ak všetko, čo chcete, aby boli vaše premenné k dispozícii pre balíky jedného skriptu, môžete použiť nástroj SQLCMD. alebo Režim SQLCMD SSMS a definovať tento nástroj / premenné v závislosti od režimu, napríklad:

: SETVAR MYVAR 10

A potom ich použite takto:

$ (MYVAR)

Použitie režimu SSQ SQLCMD:

Vy nemôžeš Odkazuje globálne premenné v SQLserveri.

Ak používate Studio Management, môžete použiť režim SQLCMD ako špecifikovaný @Lanorkin.

V opačnom prípade môžete použiť kontext_info na uloženie jednej premennej, ktorá je viditeľná počas relácie a pripojenia, ale potom zmizne.

Iba skutočne globálne vytvorí globálny dočasný stôl (s názvom ## yourtablename) a uložte tam ich premenné, ale tiež zmizne, keď sú všetky pripojenia zatvorené.

Môžete vyskúšať globálny stôl:

Vytvoriť tabuľku ## Global_var (VAR1 INT, VAR2 Int) Použite "DB_1" Go Select * z "Tabuľka", kde "Col_!" \u003d (Vybrať VAR1 z ## Global_var) a "Col_2" \u003d @ global_var_2 Použite "DB_2" Go Select * z "Tabuľka", kde "Col_!" \u003d (Vyberte VAR2 z ## Global_var)

V tomto konkrétnom príklade sa chyba vzťahuje po prevádzkovateľoch používania. Choď operátori Obnovujú prostredie, takže neexistujú žiadne premenné používateľa. Musia byť opäť oznámené. A odpoveď na otázku globálnych premenných nie je, neexistujú žiadne globálne premenné, aspoň verzia SQL servera, rovná alebo do roku 2008. Nemôžem zaručiť to isté pre novšie verzie SQL Servera.

S pozdravom, Hini

Počnúc SQL Serverom 2016 je zastúpený nový spôsob výmeny informácií v relácii Session_context. a sp_set_session_context.

Môžete ich použiť ako alternatívu k kontextu_info (), v ktorej sa skladuje iba binárna hodnota, obmedzená na 128 bajtov. Okrem toho môže užívateľ kedykoľvek prepísať hodnotu a nie je veľmi dobré používať na kontrolu.

Nasledujúce problémy sa riešia pomocou nových nástrojov. Údaje môžete uložiť v užívateľsky prívetivý formát:

Exec sp_set_session_context "Jazyk", "Angličtina"; Vyberte položku Session_context (N "Jazyk");

Okrem toho môžeme to označiť ako len na čítanie:

Exec Sp_set_session_context "user_id", 4, @read_only \u003d 1;

Ak sa pokúsite zmeniť kontext relácie len na čítanie, dostanete niečo také:

Správa 15664, Úroveň 16, Stav 1, postup SP_SET_SESES_CONTEXT, riadok 10 Nepodarilo sa nainštalovať kláves "user_id" v kontexte relácie. Kľúč bol nastavený hneď, ako pre túto reláciu.

Pokúsiť sa použiť; namiesto ísť. Pracovala pre mňa pre verziu R2 R2

Deklarovať @ global_var_1 int \u003d hodnota_1; Deklarovať @ global_var_2 Int \u003d hodnota_2; Použite "DB_1"; Vyberte * z "Tabuľka", kde "Col_!" \u003d @ Global_var_1 a "col_2" \u003d @ global_var_2; Použite "DB_2"; Vyberte * z "Tabuľka", kde "Col_!" \u003d @ Global_var_2;

Podobný výsledok je možné získať vytvorením skalárne funkcie, ktoré vracajú hodnoty premenných. Samozrejme, hovory hovorov môžu byť drahé, ak ich používate v dotazoch, ktoré vracajú veľký počet výsledkov, ale ak obmedzíte súbor výsledkov, všetko by malo byť v poriadku. Tu používam databázu vytvorenú len na ukladanie týchto hodnôt polovičných skladieb, ale môžete ich tiež vytvoriť pre každú databázu. Ako vidíte, neexistujú žiadne vstupné premenné tu, iba funkcia s dobre pomenovaným názvom, ktorý vráti statickú hodnotu: Ak túto hodnotu zmeníte na funkciu, okamžite sa zmení, kde sa používa (nasledujúca výzva). \u003e

Použite Go Vytvorenie funkcie DBOKLOBAL_GETANDANDARDFONTS () vráti Nvarchar (255), ako začať návrat "FONG FAMILY:" Calibri Light "," Sans-Serif ";" Koniec Go - Použitie: Zvoľte " ... "- Výsledok: ...

Nastavte hodnoty premenných

V súčasnosti existujú dva spôsoby, ako nastaviť hodnotu variabilnej hodnoty v SQL - na tento účel môžete použiť príkazu alebo nastaviť príkaz. Z hľadiska vykonaných funkcií pôsobia títo operátori takmer rovnaké, nepočítajú sa, že výbere príkazu umožňuje pôvodnú hodnotu priradenia z tabuľky uvedenej v výbere.

Setové vyhlásenie sa zvyčajne používa na nastavenie hodnôt premenných v tomto formulári, ktorá sa často nachádza v procesných jazykoch. Ako typické príklady aplikácie tohto operátora môžete zadať nasledovné:

Nastaviť @b \u003d @A * 1,5

Upozorňujeme, že všetci títo operátori sú priamo implementovaní priradením operácií, v ktorých sa používajú buď výslovne uvedené hodnoty alebo iné premenné. Používanie nastaveného vyhlásenia nie je možné priradiť variabilnú hodnotu získanú pomocou dotazu; Dotaz musí byť vykonaný samostatne a až potom, čo je výsledok získaný môže byť priradený pomocou nastaveného príkazu. Napríklad pokus o vykonanie takéhoto operátora spôsobuje chybu:

Nastaviť @c \u003d počet (*) z mesta

a ďalší operátor je plne úspešný:

Nastaviť @c \u003d (Vybrať počet (*) z mesta)

Výber príkazu sa zvyčajne používa na priradenie hodnôt pomocou premenných, ak zdroj informácií, ktoré musia byť uložené v premennej je dotazom. Napríklad akcie implementované v uvedenom kódexe sú oveľa častejšie implementované pomocou výberu:

Vyberte @ c \u003d počet (*) z mesta

Upozorňujeme, že tento kód je mierne jasnejší (najmä, je to viac laconic, hoci vykonáva rovnaké akcie).

Je teda možné formulovať nasledujúce všeobecne uznávané dohody o používaní ostatného prevádzkovateľa.

Setové vyhlásenie sa používa, ak musí byť vykonaná jednoduchá operácia priradenia, t.j. Ak je priradená hodnota už špecifikovaná vo forme určitej hodnoty alebo vo forme inej premennej.

Výberové vyhlásenie sa aplikuje v prípade, že priradenie hodnoty premennej musí byť založená na požiadavke.

Použitie premenných v dotazoch SQL

Jedným z užitočných vlastností jazyka T-SQL je, že premenné môžu byť použité v dotazoch bez nutnosti vytvoriť komplexné dynamické linky vloženia premenných v programovom kóde. Dynamická SQL pokračuje v jej existencii, ale jednoduchá hodnota je možné zmeniť - pomocou premennej.

Všade tam, kde je možné v dotaze použiť výraz, môže sa použiť premenná. Nasledujúci príklad ukazuje použitie premennej v sektore, kde veta:

Deklarovať @idprodut Int;

Nastaviť @idprrod \u003d 1;

Vybrať

Lokálna premenná Transact-SQL je objekt obsahujúci určitú hodnotu konkrétneho typu. Premenné sa zvyčajne používajú v balíkoch a skriptoch:

    ako cyklický pult;

    uloženie hodnoty, ktorú chcete skontrolovať inštrukcie na kontrolu prietoku;

    uložiť hodnotu vrátenú funkciou alebo uloženým postupom.

Nasledujúci skript vytvorí malú skúšobnú tabuľku z 26 riadkov. Premenná sa používa v skripte ako:

    cyklus na ovládanie počtu vložených riadkov;

    hodnoty vložené do stĺpca typu celé číslo;

    argument funkcie, ktorý tvorí reťazec, ktorý je vložený do stĺpika typu znakov:

Vytvorte stôl. Vytvoriť tabuľku testtable (COL INT, COLB CHAR (3)); Ísť nastavte Nocount Choď - vyhlásiť premennú, ktorá sa má použiť. Deklarovať @MYCOUNTER INT; - Inicializovať premennú. Nastaviť @MYCOUNTER \u003d 0; - Otestujte premennú, aby ste zistili, či je slučka dokončená. Zatiaľ čo (@mycounter.< 26) BEGIN; -- Insert a row into the table. INSERT INTO TestTable VALUES -- Use the variable to provide the integer value -- for cola. Also use it to generate a unique letter -- for each row. Use the ASCII function to get the -- integer value of "a". Add @MyCounter. Use CHAR to -- convert the sum back to the character @MyCounter -- characters after "a". (@MyCounter, CHAR((@MyCounter + ASCII("a")))); -- Increment the variable to count this iteration -- of the loop. SET @MyCounter = @MyCounter + 1; END; GO SET NOCOUNT OFF; GO -- View the data. SELECT cola, colb FROM TestTable; GO DROP TABLE TestTable; GO

Oznámenie premenných v Transact-SQL

Výučba deklarovania inicializuje premennú Transact-SQL takto:

    Priradenie názvu. Prvý znak názvu musí byť jediný symbol @.

    Účel dĺžky a typu údajov definovaných systémom alebo používateľom. Pre numerické premenné sú tiež nastavené presnosť a stupnica. Pre premenné typu XML môže byť voliteľne zbierka obvodov.

    Priradí hodnotu null vytvorenej premennou.

Napríklad nasledujúce vyhlásenie o deklarovaní vytvorí lokálny @Mycounter premennú typu údajov INT.

Deklarovať @MYCOUNTER INT;

Výučba deklaru vám umožňuje vyhlásiť niekoľko miestnych premenných rovnakých alebo rôznych druhov čiarky.

Napríklad nasledujúce deklarované pokyny vytvára tri miestne premenné, @lastname, @firstname a @stateprovince a priradí každú z nich hodnotu null:

Deklarovať @lastname Nvarchar (30), @Firstname Nvarchar (20), @stateprovince NHICH (2);

Variabilná oblasť sa nazýva rozsah inštrukcií s Transact-SQL, ktorý je možné ich spracovať. Variabilná oblasť je všetky pokyny medzi jeho vyhlásením a koncom balíka alebo uloženého postupu, kde je deklarovaný. Napríklad nasledujúci skript obsahuje chybu syntaxe, pretože premenná je deklarovaná v jednom balíku a používa sa v inom:

Použite AdventureWorks2008R2; Choď deklarovať @MMYVARY INT; Nastaviť @MMYVARY \u003d 1; - Ukončite dávku pomocou kľúčového slova Go. Go - @MMyvarible vystúpil z rozsahu a už neexistuje. - Toto vyberiete Stav mení chybu syntaxe, pretože to nie je legálne na referenciu @MMyvarible. Zvoľte BusinessEntyID, NationalIdnumber, JobTitle z humanresoures.eloyeeeee, kde Businessentyntid \u003d @Myvarible;

Premenné majú miestnu oblasť a sú k dispozícii len v rámci balíka alebo postupu, kde sú vyhlásené. V nasledujúcom príklade, vložená plocha vytvorená na vykonanie postupu SP_EXEXECECETESQL nemá prístup k premennej deklarovanej vo vyššom rozsahu a vráti chybu:

Deklarovať @MMYVARY INT; Nastaviť @MMYVARY \u003d 1; Execute SP_EXEXECETESQL N "SELECT @ MMYVARY"; - To vytvára chybu

Priradenie hodnoty premennej v transakte-sql

Pri vyhlásení premennej priradí hodnotu null. Ak chcete zmeniť hodnotu premennej, uplatňuje sa nastavenie. Výhodný je tento spôsob priradenia hodnôt premenných. Okrem toho je možné premennú priradiť hodnotu zadaním v zozname Výber inštrukcií.

Ak chcete priradiť hodnotu premennej pomocou nastaveného príkazu, musíte zadať svoje meno a pridelenú hodnotu. Výhodný je tento spôsob priradenia hodnôt premenných. Napríklad nasledujúci balík oznamuje dve premenné, prideľuje im hodnoty a používa ich v inštrukcii výberu:

Použite AdventureWorks2008R2; Choď - deklarovať dve premenné. Deklarovať @FirstNameVariteľné NVARCH (50), @POSTALKODZDEVÁRANY NVARCHRET (15); - Nastavte ich hodnoty. Set @firstnamevarible \u003d n "amy"; Nastaviť @postalcodevaríble \u003d N "BA5 3HX"; - Použite ich v prípade výberu výberu. Vyberte položku LastName, FirstName, JobTitle, City, StateprovinceName, CountryRegionName z Humanresources.Vemployee, kde FirstName \u003d @FirstNameVariteľné alebo PostalCode \u003d @POSTALCODEVORIBLE; Ísť.

Premenná môže byť priradená hodnota zadaním v zozname výberov. Ak sa výberový zoznam odkazuje na premennú, potom musí byť priradená skalári, alebo výbere výberu by malo vrátiť iba jeden riadok. Napríklad:

Použite AdventureWorks2008R2; Choď deklarovať @empidvariable Int; Vyberte @emPidvariable \u003d Max (zamestnanec) z HumanResources.Mysee; Ísť.

Ak inštrukcia Select vráti viac ako jeden riadok a variabilná sa vzťahuje na bezstarostný výraz, priraďuje sa hodnota, ktorá sa vráti, aby sa vyjadril v poslednom riadku výsledného súboru. Napríklad v nasledujúcom premennej balení je @empidvarible priradené hodnotu identifikátora podniku posledného vráteného reťazca rovným 1:

Použite AdventureWorks2008R2; Choď deklarovať @empidvariable int; Vyberte @empidvarible \u003d BusinessEntityId z humanresources.eMyeee si objednať podľa obchodu, Vyberte @emPidvariable; Ísť.

Posledná aktualizácia: 08/14/2017

Prostredníctvom premenných môžeme preniesť údaje na požiadavky. A môžeme tiež dostávať údaje, ktoré sú výsledkom požiadaviek, premenných. Napríklad pri odbere vzoriek z tabuliek pomocou príkazu Select môžeme získať údaje na premennú pomocou nasledujúcej syntaxe:

Select @ variable_1 \u003d špecifikácia_libes_1, @ variable_2 \u003d špecifikácia_stolbet_2, ........................................ @ variabilné_n \u003d špecifikácia_stolbet_n.

Okrem toho, v nastavení expresie, hodnota priradená k premennej môže byť tiež výsledkom príkazu Select.

Buďme napríklad nasledovné tabuľky:

Vytvorenie tabuľkových výrobkov (ID INT INTENTITY PRIREBNÉ KEY, PRODUKTNAME NVARCHET (30) NIE JE NULL, výrobca NVARCHARCH (20) NIE JE NULL, PRODUKTCOST Vytvorenie tabuľky Zákazníci (ID INT INTENTITY PRIRESTNÝ KEY, FIRSTNAME NVARCHARCH (30) Nie null); Vytvoriť tabuľkové príkazy (ID INT INTENTITY PRIREBNÉ KEY, PRODUKTIDLO INT NIE NOT NULT Referencie Produkty (ID) na Delete Cascade, CustomerID Int Non Null Referencie Zákazníci (ID) On Delete Cascade, CAVENATATE DÁTUM NIE NULL, productCount Inte predvolené 1, Cenové peniaze NOTL NULL );

Pri odstraňovaní údajov používajte premenné:

Deklarovať @MaxPrice Money, @ MinPrice Money, @DIF MONEY, @COUNT Int SET @COUNT \u003d (vyberte SUM (SUME (productcount) z objednávok); Select @ MinPrice \u003d min (cena), @MaxPrice \u003d max (cena) z produktov SET @DIF \u003d @MAXPRICE - @ Minify; Tlač "Celkový predaj:" + STR (@COUNT, 5) + "Produkt (y)"; Vytlačiť "Rozdiel medzi maximálnou a minimálnou cenou:" + STR (@DIF)

V tomto prípade bude premenná @COUNT obsahovať množstvo všetkých hodnôt z tabuľky objednávok stôl Productcount, to znamená, že celkový počet predaných tovarov.

Premenné @min a @max sú uložené, minimálne a maximálne hodnoty stĺpcovej ceny z tabuľky produktov a premenná @DIF je rozdiel medzi týmito hodnotami. A ako jednoduché hodnoty, premenné sa môžu tiež zúčastňovať na operáciách.

Ďalší príklad:

Deklarovať @sum peniaze, @id INT, @prodid Int, @Name Nvarchar (20); SET @ ID \u003d 2; Select @sum \u003d suma (objednávky.Price * Orders.ProductCount), @ Názov \u003d Products.ProductName, @prodid \u003d Products.ID z objednávok Inner Pripojiť produkty na produkted \u003d Products.id Group podľa produktov.ProductName, Products.ID [Chránené e-mail] Tlač "Produkt" + @Name + "predáva za množstvo" + STR (@sum)

Tu sa obnoviteľné údaje z dvoch tabuliek a objednávok sú zoskupené pomocou stĺpcov ID a ProductName z tabuľky produktov. Potom sa údaje prefiltrujú cez stĺpec ID z produktov. A extrahované dáta spadá do premenných @sum, @NAME, @prodid.

Pravdepodobne jeden z prvých otázok vyplývajúcich z nováčikov na T-SQL, to je otázka "a ako získať vzorku z tabuľky, ktorého meno je uvedené v premennej?"
Pretože V T-SQL nie je možné použiť v niektorých častiach hodnoty variabilných hodnôt, jediným dostupným riešením je použitie dynamickej požiadavky. Myšlienka je veľmi jednoduchá: v špeciálne definovanej premennej "Zbierajte" reťazec dotazu, ktorý sa musí vykonať. Potom sa tento reťazec začne vykonávať. Beh môže byť implementovaný dvoma spôsobmi.
- Používanie príkazu Execute
- Používanie systému SP_EXEXECESTESTSQUL.

Vyzerá to tak

Deklarovať @sql varchar ( 8000 ), @Table_name varchar ( 10 ) Nastaviť @sql \u003d "Select * z" + @table_name exec (@sql) - a exec sp_executesql @sql zvyčajne dynamické požiadavky sú vytvorené vo vnútri uložených postupov, v ktorých je špecifický reťazec vykonania zostavený vstupným parametrom.

I. Dynamická požiadavka
1. Dynamický dotaz je vždy spustený v rovnakom konektore a ako samostatný balík (dávka). Inými slovami, pri použití takejto požiadavky,
- Nemáte prístup k miestnym premenným, oznámené pred výzvou dynamickej žiadosti (prístup k predtým zavedeným dočasným tabuľkám)
- Miestne časové tabuľky a premenné vytvorené počas vykonávania príkazu exec nebudú dostupné v procese volania, pretože Sa odstráni na konci balíka, v ktorom sa vykonáva exec.

2. Dynamická požiadavka sa vždy vykonáva s právami užívateľa, ktorý spôsobil postup, a nie s právami vlastníka postupu. Inými slovami, ak je vlastníkom postupu1 Postupom používateľa1, ktorý má právo na tabuľku tabuľky1, potom pre užívateľa Uster2 trochu na pridelenie práv na vykonanie postupu1 postupu, ak odvolanie na IT tabuľky1 prechádza dynamickým dotazom. Budeme mu musieť poskytnúť vhodné práva a priamo pre tabuľku1.

3. Dokončenie žiadosti dochádza bezprostredne pred jeho volaním. Tí. V tomto okamihu sa dozviete len o všetkých syntaktických chybách.

Ii. Možnosti používajte EXEC TEAM
1. Príkaz Exec podporuje riadky a / alebo premenné k argumentu ako argument. Ale nepodporuje zreťazenie výsledkov funkcií, t.j. Návrhy typu
exec ("Select * z" + vľavo (@tabname, 10 )) Zakázané používať.
2. Príkaz nemá vstupné / výstupné parametre.

III. SP_EXEXECESTSQL POSTUP
1. Postup nepodporuje konfekciu a / alebo premenné ako parametre.
2. Text dotazu musí byť buď variabilný typ Nvarchar / NHHHR alebo rovnaký typ konštantnej reťazca.
3. Parametre je možné preniesť na spustiteľný skript a získavanie hodnôt výstupu.
Ten zjavne nie je opísaný v dokumentácii, takže tu sú niektoré príklady

V tomto príklade sa v dynamickej požiadavke prenáša 4 premenné, z ktorých tri sú víkendy.

deklarovanie @ var1 int, @ var2 varchar ( 100 ), @ Var3 varchar ( 100 ), @ var4 int deklarovať @mysql nvarcharch 4000 ) set @mysql \u003d "SET @ VAR1 \u003d @ VAR1 + @ VAR4; SET @ VAR2 \u003d""CCCC" "; SET @ VAR3 \u003d @ VAR3 +" "DDDD" "" SET @ VAR1 \u003d 0 SET @ VAR2 \u003d "BBBB" SET @ VAR3 \u003d "AAAA" SET @ VAR4 \u003d 10 Select @ var1, @ var2, @ var3 exec sp_executesql @MYSQL, N "@ Var1 Int Out, @ Var2 Varchar (100) Out, @ VAR3 VARCHAR (100) OUT, @ VAR4 INT" \\ t, @ Var1 \u003d @ Var1 Out, @ Var2 \u003d @ Var2 Out, @ Var4 \u003d @ Var4 Select @ Var1, @ var2, @ var3 \\ t

V tomto príklade sa kurzor otvorí v dynamickom dotaze, ktorý je k dispozícii vo volanom procese prostredníctvom výstupnej premennej

Použite krčmy deklarovanie @cur Cursor EXEC SP_EXECECUTESQUL N "SET @ CURVAR \u003d Kurzor Miestne pre Vybrať TOP 10 AU_ID, AU_LNAME, AU_FNAME z autorov Open @Curvar" , N "@CURVAR Kurzorový výstup", @ [Chránené e-mail] Výstup načítanie vedľa @cur, kým @@ fetch_status \u003d 0 Začnite Fets Fead z @CUR END

Zhrnutie (viac IMHO ako povinné požiadavky)
Dynamická požiadavka je veľmi užitočná a niekedy len nepostrádateľná vec, ale metódy jeho implementácie a konkrétne prostredníctvom výzvy v samostatnom balíku s právami používateľa, ktorý spôsobil postup, zadržiavajú svoju praktickú hmotu.



Páči sa vám článok? Zdieľaj to