konstrukcja: INTO :Zmienna w T-SQL
Issan - 15-11-2006 00:15
konstrukcja: INTO :Zmienna w T-SQL
Uzywałem wczesniej PL/SQL, a teraz cos robię w SQL Server 2005 Express.
I problem mam oto taki: W T-SQL nie chca mi dzialac konstrukcje z ze zmiennym dowiazanymi
Select pole from tablica INTO :Zmienna
I musze robic takie coś:
DECLARE kursor_cur CURSOR FOR select pole from tablica;
I potem brac potrzebna wartosc poprzez FETCH NEXT FROM kursor_cur INTO @Zmienna
Toć to bez sensu ! Czy aż kursor jest tu potrzebny, gdy chce jedna daną wyciagnac z zapytania ..... ?
Dajcie proszę wskazówkę jaką ...
Issan
Paweł Filipiak - 15-11-2006 00:15
"Issan" <zbjann@wp.pl> wrote in message news:ejd7gj$mpm$1@achot.icm.edu.pl... > Uzywałem wczesniej PL/SQL, a teraz cos robię w SQL Server 2005 Express. > > I problem mam oto taki: > W T-SQL nie chca mi dzialac konstrukcje z ze zmiennym dowiazanymi > > Select pole from tablica INTO :Zmienna >
select @zmienna = pole from tabela where....
w przeciwieństwie do pl/sql kontrukcja nie zgłosi błędu w sytuacji, gdy zapytanie nie zwróci żadnego rekordu (wtedy przypisze wartość null) lub zwróci więcej niż jeden wiersz (wtedy przypisze pierwszą wartość z brzegu, wg porządku zwróconych rekordów)
Używanie kursorów w mssql raczej nie wskazane, ze względu na dramatycznie małą wydajność. Jeżeli już, to stosuj, o ile możliwe kursory z klauzulami static, read_only, local - szczegóły uzycia w bol.
-- pozdrawiam, Paweł Filipiak
Issan - 15-11-2006 00:16
Dziekuję pięknie. Przetestowałem i działa. Ale tylko przy prostych zapytaniach.
Bo w poniższym przypadku :
declare @Dokument varchar(30) Select Top 1 @Dokument = Dokument, (Select Upust from Upust where Upust.Kontrahent = sprzedaz.Kontrahent) / (Select SUM (Kwota) from sprzedaz sp2 where sp2.Kontrahent = sprzedaz.Kontrahent) - Upust / Kwota as Odchylenie From sprzedaz Where Kontrahent = '002' Order by Odchylenie DESC, Kwota DESC
zakonczło sie błedem: A SELECT statement that assigns a value to a variable must not be combined with data-retrieval operations. Rozumiem, ze to zapytanie jest zbyt 'pokrętne' (z powodu funkcji agregujacych) i podana konstukcja działa tylko przy prostych zapytaniach ?
pozdrawiam,
Issan
Użytkownik "Paweł Filipiak" <pfilipiak@poczta.fm> napisał w wiadomości news:ejd85h$d89$1@atena.e-wro.net... > "Issan" <zbjann@wp.pl> wrote in message > news:ejd7gj$mpm$1@achot.icm.edu.pl... > > Uzywałem wczesniej PL/SQL, a teraz cos robię w SQL Server 2005 Express. > > > > I problem mam oto taki: > > W T-SQL nie chca mi dzialac konstrukcje z ze zmiennym dowiazanymi > > > > Select pole from tablica INTO :Zmienna > > > > > select @zmienna = pole from tabela where.... > > w przeciwieństwie do pl/sql kontrukcja nie zgłosi błędu w sytuacji, gdy > zapytanie nie zwróci żadnego rekordu (wtedy przypisze wartość null) lub > zwróci więcej niż jeden wiersz (wtedy przypisze pierwszą wartość z brzegu, > wg porządku zwróconych rekordów) > > Używanie kursorów w mssql raczej nie wskazane, ze względu na dramatycznie > małą wydajność. Jeżeli już, to stosuj, o ile możliwe kursory z klauzulami > static, read_only, local - szczegóły uzycia w bol. > > -- > pozdrawiam, > Paweł Filipiak >
Filip Rembiałkowski - 15-11-2006 00:16
On 14 Lis, 22:08, "Issan" <zbj...@wp.pl> wrote: > Dziekuję pięknie. > Przetestowałem i działa. > Ale tylko przy prostych zapytaniach. > > Bo w poniższym przypadku : > > declare @Dokument varchar(30) > Select Top 1 > @Dokument = Dokument, > (Select Upust from Upust where Upust.Kontrahent = sprzedaz.Kontrahent) > / (Select SUM (Kwota) from sprzedaz sp2 where sp2.Kontrahent = > sprzedaz.Kontrahent) - Upust / Kwota as Odchylenie > From sprzedaz > Where Kontrahent = '002' > Order by Odchylenie DESC, Kwota DESC > > zakonczło sie błedem: > A SELECT statement that assigns a value to a variable must not be combined > with data-retrieval operations. Zapytanie SELECT które przypisuje wartość do zmiennej musi przypisywać wszystkie kolumny do zmiennych. Nie możesz przypisać części wyniku do zmiennych a reszty wypluć na ekran.
więc w tym konkretnym przypadku, po prostu przesuń cały kod, który wylicza warunek, do klauzuli WHERE. (nie umieszczaj go po SELECT)
Select Top 1 @Dokument = Dokument From sprzedaz Where Kontrahent = '002' Order by ( (Select Upust from Upust where Upust.Kontrahent = sprzedaz.Kontrahent) / (Select SUM (Kwota) from sprzedaz sp2 where sp2.Kontrahent = sprzedaz.Kontrahent) - Upust / Kwota ) DESC, Kwota DESC
możesz też go przechwycic do drugiej zmiennej jeżeli to Ci bardziej odpowiada :)
> Rozumiem, ze to zapytanie jest zbyt 'pokrętne' (z powodu funkcji > agregujacych) i podana konstukcja działa tylko przy prostych zapytaniach ? > działa
Grzesiek G. - 16-11-2006 00:22
Paweł Filipiak napisał(a): > "Issan" <zbjann@wp.pl> wrote in message > news:ejd7gj$mpm$1@achot.icm.edu.pl... > >> Uzywałem wczesniej PL/SQL, a teraz cos robię w SQL Server 2005 Express. >> >> I problem mam oto taki: >> W T-SQL nie chca mi dzialac konstrukcje z ze zmiennym dowiazanymi >> >> Select pole from tablica INTO :Zmienna >> > > > select @zmienna = pole from tabela where.... > > w przeciwieństwie do pl/sql kontrukcja nie zgłosi błędu w sytuacji, gdy > zapytanie nie zwróci żadnego rekordu (wtedy przypisze wartość null) lub
Nie - nie przypisze nic. Poniższy kod: DECLARE @i INT SET @i = 1 SELECT @i = 0 WHERE 0 = 1 PRINT @i
wypisuje 1, a nie nulla. Dlatego niektórzy zalecaję używanie przypisań wg standartu ANSI, poniższe: DECLARE @i INT SET @i = 1 SET @i = (SELECT 0 WHERE 0 = 1) IF @i IS NULL PRINT 'jest null'
wypisze 'jest null'.
> zwróci więcej niż jeden wiersz (wtedy przypisze pierwszą wartość z > brzegu, wg porządku zwróconych rekordów) >
Dokładnie rzecz biorąc zwróci ostatni :-).
> Używanie kursorów w mssql raczej nie wskazane, ze względu na > dramatycznie małą wydajność. Jeżeli już, to stosuj, o ile możliwe > kursory z klauzulami static, read_only, local - szczegóły uzycia w bol. >
A to już sama prawda.
Pozdrawiam
-- Grzegorz Gruza Odpowiadając usuń "spamerom_nie." z adresu!!!
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
jak to =?ISO-8859-2?Q?zrobi=E6=2E=2E=2E=3F_TSQL_sql_server?==?ISO-8859-2?Q?_?=
Jak =?windows-1250?Q?pobra=E6_szacowan=B9_wielko=9C=E6_zbiory_wy nikowego_w_MS?==?windows-1250?Q?_SQL_2005=3F?=
=?iso-8859-2?Q?=5BMS_SQL=5D_Czy_mo=BFna_wywo=B3a=E6_funkcje_t ylko_raz_dla?==?iso-8859-2?Q?_ca=B3ego_zbioru_=BCr=F3d=B3owego=3F?=
[MSSQL] =?ISO-8859-2?Q?zgodno=B6ci_z_licencjami_Microsoft_?==?ISO-8859-2?Q?SQL_Server?=
=?ISO-8859-2?Q?k=B3opot_z_uruchomieniem_MY_SQL_dla_C?==?ISO-8859-2?Q?MS_i_CRM_na_Fedora_Core_3?=
Oracle PL/SQL Wstawianie =?ISO-8859-2?Q?wynik=F3w_kolekcji_d?==?ISO-8859-2?Q?o_tabeli?=
[MSSQL] ACCESS - SQL =?ISO-8859-2?Q?B=B3ad_w_konwersji_lic?==?ISO-8859-2?Q?zb?=
=?iso-8859-2?Q?=5Bmssql=5D_Zapytania_rekurencyjne__-_czy_sk=B3adnia_sql?==?iso-8859-2?Q?_co=B6_takiego_przewiduje_=3F?=
[Oracle PL/SQL] Cursor i zapis =?ISO-8859-2?Q?rekord=F3w_do_?==?ISO-8859-2?Q?kolejnych_plik=F3w?=
=?iso-8859-2?Q?=5BMySQL=5D_Co_minimalnie_potrzebne_zeby_mie=E 6_klienta_My?==?iso-8859-2?Q?SQL_na_Linuxie=3F?=
zanotowane.pldoc.pisz.plpdf.pisz.plwawa19wwa91.pev.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|