Salvarea unei valori select count(*) la un număr întreg (SQL Server) (Programare, Server Sql, Tsql, Agregat, Atribuirea Variabilelor)

larryq a intrebat.
a intrebat.

Am ceva probleme cu această declarație, datorită, fără îndoială, ignoranței mele cu privire la ceea ce este returnat de această declarație select:

declare @myInt as INT
set @myInt = (select COUNT(*) from myTable as count)

if(@myInt <> 0) 
begin
   print 'there's something in the table'
end

Există înregistrări în myTable, dar când execut codul de mai sus, instrucțiunea de imprimare nu este niciodată executată. Verificări suplimentare arată că myInt este de fapt zero după atribuirea de mai sus. Sunt sigur că îmi scapă ceva, dar am presupus că o numărătoare select ar returna un scalar pe care l-aș putea folosi mai sus?

Comentarii

  • Acest cod rulează bine pentru mine pe câteva servere la care am acces – puteți să detaliați situația care cauzează acest comportament? Un vechi și obișnuit „SELECT COUNT(*) FROM Table” returnează ceea ce vă așteptați? –  > Por SqlRyan.
4 răspunsuri
gbn

Dacă @myInt este zero, înseamnă că nu există rânduri în tabel: ar fi NULL dacă nu este setat niciodată.

COUNT va returna întotdeauna un rând, chiar și în cazul în care nu există rânduri într-un tabel.

Edit, Apr 2012: regulile pentru acest lucru sunt descrise în răspunsul meu aici: COUNT(*) returnează întotdeauna un rezultat?

Numărătoarea/alocarea dvs. este corectă, dar ar putea fi în ambele feluri:

select @myInt = COUNT(*) from myTable
set @myInt = (select COUNT(*) from myTable)

Cu toate acestea, dacă căutați doar existența unor rânduri, (NOT) EXISTS este mai eficient:

IF NOT EXISTS (SELECT * FROM myTable)

user151323
select @myInt = COUNT(*) from myTable

Comentarii

  • Acesta nu este răspunsul, ci doar o construcție alternativă de atribuire. Aceasta va da în continuare „zero” –  > Por gbn.
Thomas
Declare @MyInt int
Set @MyInt = ( Select Count(*) From MyTable )

If @MyInt > 0
Begin
    Print 'There''s something in the table'
End

Nu sunt sigur dacă aceasta este problema ta, dar trebuie să esacpezi ghilimelele simple din instrucțiunea print cu un al doilea ghilimele simple. Deși puteți folosi SELECT pentru a popula variabila, folosirea SET, așa cum ați făcut aici, este foarte bună și mai clară, IMO. În plus, puteți fi siguri că Count(*) nu va returna niciodată o valoare negativă, astfel încât trebuie doar să verificați dacă este mai mare decât zero.

Comentarii

  • Am modificat instrucțiunea print pentru a avea sens în postarea mea (avea un mesaj specific de afaceri) și am uitat să scap de ghilimele. Mulțumesc pentru ajutor în ceea ce privește alegerea select/set! –  > Por larryq.
larryq

actualizare] — Ei bine, propria mea prostie oferă răspunsul la această întrebare. După cum se pare, am șters înregistrările din myTable înainte de a rula instrucțiunea select COUNT.

Cum de am făcut asta și nu am observat? Mă bucur că ați întrebat. Am testat o platformă de testare a unităților sql. (tsqlunit, dacă vă interesează). și, ca parte a unuia dintre teste, am rulat o instrucțiune truncate table, apoi cea de mai sus. După ce testul unitar s-a terminat totul este dat înapoi, iar înregistrările sunt din nou în myTable. De aceea am obținut un număr de înregistrări în afara testelor mele.

Îmi cer scuze tuturor… mulțumesc pentru ajutor.