[T-SQL] pobieranie ID jezeli wiersz istnieje
Łuk@asz - 13-11-2006 00:46
[T-SQL] pobieranie ID jezeli wiersz istnieje
Witam
Czy jest jakaś lepsza praktyka na pobieranie ID o ile wiersz istnieje niż to:
SELECT TOP 1 @address_id = ID FROM [EmailRepository].[dbo].[SenderAdresses] WHERE ( [User] = @user AND Host = @host )
IF (@address_id <> NULL) BEGIN ... END
Czy da się jakoś z :
IF EXISTS( SELECT ID FROM [EmailRepository].[dbo].[SenderAdresses] WHERE ( [User] = @user AND Host = @host ) )...
przypisać ID do czegoś?
Przy okazji, czy jest jakaś znacząca różnica pomiędzy SELECT TOP 1 @address_id = ID a SELECT @address_id = (Select TOP 1 ID ...)
która przemawiałaby za "wyższością" jednego nad drugim w powyższym przykładzie?
Z góry dziękuję za odpowiedzi Łukasz
Marcin A. Guzowski - 13-11-2006 00:46
Łuk@asz napisał(a): > Witam > > Czy jest jakaś lepsza praktyka na pobieranie ID o ile wiersz istnieje > niż to: > > SELECT TOP 1 @address_id = ID > FROM [EmailRepository].[dbo].[SenderAdresses] > WHERE ( [User] = @user AND Host = @host ) > > IF (@address_id <> NULL) > BEGIN > ... > END
Zależy co rozumiesz pod pojęciem pobieranie. Jeżeli chodzi Ci o inicjalizację/przypisanie do zmiennej - to nie.
> Czy da się jakoś z : > > IF EXISTS( > SELECT ID > FROM [EmailRepository].[dbo].[SenderAdresses] > WHERE ( [User] = @user AND Host = @host ) > )... > > przypisać ID do czegoś?
Nie, w wyrażeniu EXISTS nie może nastąpić przypisanie do zmiennej.
> Przy okazji, czy jest jakaś znacząca różnica pomiędzy > SELECT TOP 1 @address_id = ID > a > SELECT @address_id = (Select TOP 1 ID ...) > > która przemawiałaby za "wyższością" jednego nad drugim w powyższym > przykładzie?
Sposób pierwszy jest bardziej prawidłowy semantycznie oraz ma teoretycznie bardziej optymalny plan wykonania. Ze względu jednak na specyfikę operacji - różnice wydajnościowe byłoby bardzo ciężko zaobserwować.
-- Pozdrawiam, Marcin Guzowski http://guzowski.info
Łuk@asz - 13-11-2006 00:46
> Zależy co rozumiesz pod pojęciem pobieranie. Jeżeli chodzi Ci > o inicjalizację/przypisanie do zmiennej - to nie.
O to właśnie. Piękne dzięki, wymarzona odpowiedź :-)
Pozdrawiam Łukasz
Jarek - 13-11-2006 00:46
>> Przy okazji, czy jest jakaś znacząca różnica pomiędzy >> SELECT TOP 1 @address_id = ID >> a >> SELECT @address_id = (Select TOP 1 ID ...) >> > Sposób pierwszy jest bardziej prawidłowy semantycznie oraz ma > teoretycznie bardziej optymalny plan wykonania. Ze względu jednak > na specyfikę operacji - różnice wydajnościowe byłoby bardzo ciężko > zaobserwować. > > > -- > Pozdrawiam, > Marcin Guzowski > http://guzowski.info
Cześć,
Różnica jest i to duża. Jeśli zapiszemy drugie klauzule bardziej T-SQL ( SET @adres_id= (Select TOP 1 ID ...) ) to różnica jest jeszcze bardzie widoczna: jeśli select nie zwóci żadnego rekordu to w @adres_id ustawiony będzie NULL, w przypadku pierwszej składni jeśli zapytanie nie zwróci niczego to @adres_id zostanie niezmieniony (nie jest tam wpisany żaden NULL jak można byłoby spodziewać.)
pozdr
Jarek
Łuk@asz - 13-11-2006 00:46
Fakt, ale to też nie chce działać, nie wiem czemu
DECLARE @address_id smallint SET @address_id = ( SELECT TOP 1 ID FROM [EmailRepository].[dbo].[SenderAddresses] WHERE ( [User] = @user AND Host = @host ) )
IF (@address_id = NULL) BEGIN -- tu nie wchodzi mimo, ze select top 1 ID... nic nie zwraca -- czyżby zły warunek? INSERT INTO [EmailRepository].[dbo].[SenderAddresses] ( [User], Host ) VALUES ( @user, @host ) SET @address_id = @@IDENTITY END
Jarek - 13-11-2006 00:46
Użytkownik ""Łuk@asz"" <mentos-del@konto.pl> napisał w wiadomości news:ei5npv$fb4$1@node5.news.atman.pl... > Fakt, ale to też nie chce działać, nie wiem czemu > > DECLARE @address_id smallint > SET @address_id = ( SELECT TOP 1 ID > FROM [EmailRepository].[dbo].[SenderAddresses] > WHERE ( [User] = @user AND Host = @host ) > ) > > IF (@address_id = NULL) > BEGIN
Logika trój wartościowa (porównując coś z NULL, wynik będzie NULL). Można to zmienić globalnie dla serwera i dla sesji (ANSI_NULL) ale nie radzę. Racze napisz IF (@adres_id is null) begin
end
pozdr
Jarek
Marcin A. Guzowski - 13-11-2006 00:46
Jarek napisał(a): > Różnica jest i to duża. Jeśli zapiszemy drugie klauzule bardziej T-SQL ( > SET @adres_id= (Select TOP 1 ID ...) ) to różnica jest jeszcze bardzie > widoczna: jeśli select nie zwóci żadnego rekordu to w @adres_id ustawiony > będzie NULL, > w przypadku pierwszej składni jeśli zapytanie nie zwróci niczego to > @adres_id zostanie niezmieniony (nie jest tam wpisany żaden NULL jak można > byłoby spodziewać.)
Racja, przeoczyłem to. Zapisy nie są jednoznaczne logicznie w każdej z możliwych sytuacji.
-- Pozdrawiam, Marcin Guzowski http://guzowski.info
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.plquentinho.opx.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 |
|