Nesen uzdūros rakstam, kas lika padomāt par lietām, ko iepriekš nebiju pārdomājis.
Apskatīsim piemēru:
Create Table #tLai parametram piešķirtu vērtību, mēs varētu izmantot šādu vaicājumu (tātad- mainīgajam @i tiek piešķirta vērtība no #t temporālās tabulas):
(
skaitlis int
)
Go
Insert Into #t(skaitlis) values (1)
Insert Into #t(skaitlis) values (2)
Insert Into #t(skaitlis) values (3)
Insert Into #t(skaitlis) values (4)
Declare @i intBet kāda vērtība tad tika piešķirta parametram? Patiesībā tam tika piešķirtas visas vērtības pēc kārtas. Beigās gan nolasot @i vērtību, tā būs pēdējā piešķirtā. šajā gadījumā "4".
Select @i = Skaitlis from #t
Select @i
Piemēram, šādā gadījumā:
Declare @i intSalīdzinoši ar iepriekšējo vaicājumu parametra vērtībā būs "1", jo rezultāti ir sakārtoti pretējā secībā.
Select @i = Skaitlis from #t Order By Skaitlis DESC
Select @i
Un tā interesantā lieta: parametra piešķiršana notiek katrai rezultātu rindiņai, tātad šo īpašību var izmantot kā kursora aizvietotāju. Piemēram, sasummēsim visas vērtības:
Declare @i intJā! Šajā gadījumā tas ir gluži kā izpildīt vaicājumu:
Set @i = 0
Select @i = @i + IsNull(Skaitlis,0) from #t
Select @i
Select Sum(Skaitlis) from #tPiekrītu, summas iegūšanai aprakstītais veids nav laba alternatīva. Bet citos gadījumos aprakstītais varētu būt pavisam veiksmīga alternatīva, piemēram:
Declare @i nvarchar(max)Iegūst rezultātu "1;2;3;4;"
Set @i = ''
Select @i = @i + Cast(Skaitlis as nvarchar) + ';' from #t
Select @i
* Šī lieta man arī tieši ieinteresēja teksta virknes veidošanas kontekstā. Jau iepriekš emuārā bija raksts, kā šādu virkni iegūt pēc iespējas efektīvākā veidā, neizmantojot kursoru (risinājums ar CLR agregātfunkciju: CLR agregātfunkcijas piemērs). Šajā sakarā, domājams, būs vēl viens raksts, kurā apvienošu visus variantus (padomā veseli 4).
** Runājot par šī raksta sākumā pieminēto rakstu- tajā kā piemērs dots skripts, kas atsist visus lietotājus (lai atjaunotu datu bāzi no rezerves kopijas). Man šāds variants liktos labāks:
Use Master
ALTER DATABASE TDatuBaze SET SINGLE_USER WITH ROLLBACK IMMEDIATE
RESTORE DATABASE ...
ALTER DATABASE TDatuBaze SET MULTI_USER WITH ROLLBACK IMMEDIATE
Nav komentāru:
Ierakstīt komentāru