2010-03-08 7 views
11

나는이 select 문에서 반환되는 것의 나의 무지에 의심의 여지 때문에,이 사항이 몇 가지 문제가있어 :(SQL 서버)

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

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

을 myTable에 레코드가 있지만 위의 코드를 실행하면 print 문이 실행되지 않습니다. 추가 검사는 위의 할당 후에 myInt가 실제로 0임을 보여줍니다. 나는 뭔가를 놓치고 있다고 확신하지만 select count가 위에서 사용할 수있는 스칼라를 반환한다고 가정했습니다.

+0

이 코드는 내가 액세스 할 수있는 몇 대의 서버에서 제대로 실행됩니다.이 동작을 일으키는 상황을 자세히 설명 할 수 있습니까? 정규 오래된 "SELECT COUNT (*) FROM Table"이 예상 한 것을 반환합니까? – SqlRyan

답변

32

@myInt가 0이면 테이블에 행이 없음을 의미합니다. 전혀 설정하지 않으면 NULL이됩니다.

COUNT는 테이블의 행이없는 경우에도 항상 행을 반환합니다. 당신이 경우,

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

그러나 :

편집, 2012년 4월
: Does COUNT(*) always return a result?

귀하의 카운트/할당이 정확하지만 어느 방법이 될 수있다 :이 규칙은 여기 내 대답에 설명되어 있습니다 단지 (NOT) EXISTS, 행의 존재를 찾고 더 효율적입니다 :

IF NOT EXISTS (SELECT * FROM myTable) 
9
select @myInt = COUNT(*) from myTable 
+0

이것은 대답이 아니며 대체 할당 구성입니다. – gbn

4
Declare @MyInt int 
Set @MyInt = (Select Count(*) From MyTable) 

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

이것이 문제가되는지는 잘 모르겠지만 print 문에 작은 따옴표로 작은 따옴표를 esacpe해야합니다. SELECT를 사용하여 변수를 채울 수 있지만 여기에서 수행 한 것처럼 SET를 사용하면 IMO가 훌륭하고 명확합니다. 또한 Count (*)가 음수 값을 반환하지 않으므로 0보다 큰지 여부 만 확인하면됩니다.

+0

print 문장을 변경하여 내 게시물에서 의미가 있으며 (비즈니스 관련 메시지가 있음) 인용문에서 빠져 나오는 것을 잊었습니다. 선택/설정 선택에 대한 귀하의 도움에 감사드립니다! – larryq

0

[업데이트] - 글쎄, 내 자신의 어리 석음이이 답변을 제공합니다. 결과적으로 select COUNT 문을 실행하기 전에 myTable에서 레코드를 삭제했습니다.

나는 어떻게 그렇게 했습니까? 다행스럽게 물으 셨습니다. 나는 SQL 단위 테스트 플랫폼 (tsqlunit, if you're interested)을 테스트 해왔다. 그리고 테스트 중 하나의 일부로 위의 테이블을 잘라 버렸다. 단위 테스트가 끝나면 모든 것이 롤백되고 레코드는 myTable에 다시 나타납니다. 그래서 내가 시험 밖에서 기록을 세웠다.

죄송합니다. 귀하의 도움에 감사드립니다.