ďťż
 
[T-SQL] pobieranie ID jezeli wiersz istnieje ďťż
 
[T-SQL] pobieranie ID jezeli wiersz istnieje
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

[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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • quentinho.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com