2012-02-17 3 views
4

데이터베이스 정 결함 검사 코드의 경우 특정 object_id가 비어있는 테이블과 일치하는지 확인하고 싶습니다.MSSQL : 주어진 테이블의 object_id가 비어 있는지 확인하십시오.

select count(*) from magic_operator(my_object_id) 또는 이와 비슷한 방법이 있습니까?

필자는 MS SQL 서버 2008b에서 실행할 수있는 pure-sql 솔루션을 강력히 선호합니다. 당신이 두 부분 개체 이름을 포함하는 동적 SQL 문자열을 구성하고 실행해야 보장 된 정도를 원하는 경우에

답변

11

당신은

SELECT SUM(rows) 
FROM sys.partitions p 
WHERE index_id < 2 and [email protected]_object_id 

에서 거친 아이디어를 얻을 수 있습니다. 아래의 예제에서는 이것을 사용하는 방법에 따라 sp_executesql을 사용하고 결과를 대신 출력 매개 변수로 반환 할 수 있습니다.

DECLARE @DynSQL nvarchar(max) = 
      N'SELECT CASE WHEN EXISTS(SELECT * FROM ' + 
      QUOTENAME(OBJECT_SCHEMA_NAME(@my_object_id)) + '.' + 
        QUOTENAME(OBJECT_NAME(@my_object_id)) + 
      ') THEN 0 ELSE 1 END AS IsEmpty' 


EXECUTE (@DynSQL) 
+0

어쨌든 나는 모든 경우에'sp_executesql'을 사용할 것입니다. 또한 'COUNT (*)'대신에 'EXISTS'를 사용하는 것뿐만 아니라 두 가지 옵션에 +1 또한 ... –

+0

와우 - 첫 번째 솔루션은 어떻게 작동합니까? 어떤 종류의 인덱스에서 행 수를보고 있습니다. 그래서 특정 파일 그룹의 행을 추측하고 있습니다. 또는 ...? 왜 정확하지 않을까요? 두 번째 것보다 더 단순 해 보입니다. 그게 제가 사용할 것입니다 - 고마워요! –

+1

@EamonNerbonne - 100 % 정확함을 보장하지 않습니다. 커밋되지 않은 트랜잭션의 영향을 포함하며 [수동으로 업데이트 할 수 있습니다] (http://sqlblog.com/blogs/ben_nevarez/archive/2010/01/13/fooling-the-query-optimizer.aspx) 동기화를 벗어날 수 있습니다. 때로는 DBCC UPDATEUSAGE로 수정해야합니다 (정확한시기는 확실하지 않습니다). –

3

그럼 내가 다음과 같은 해결책을 마련했습니다 Pure sql 당신이 생각하는 일에 따라 달라집니다. 그것은 순전히 T-SQL로 작성하지만, 동적 변경 사항은 주석에 설명 가능한 결함이있는 경우를 고려

쿼리

-- Using variables just for better readability. 
DECLARE @Name NVARCHAR(4000) 
DECLARE @Schema NVARCHAR(4000) 
DECLARE @Query NVARCHAR(4000) 

-- Get the relevant data 
SET @Schema = QUOTENAME(OBJECT_SCHEMA_NAME(613577224)) 
SET @Name = QUOTENAME(OBJECT_NAME(613577224)) 
-- Build query taking into consideration the schema and possible poor object naming 
SET @Query = 'SELECT COUNT(*) FROM ' + @Schema + '.' + @Name + '' 
-- execute it. 
EXEC(@Query) 

편집을 내장 사용합니다.

나는이 방법이 나에게 편리한 접근법이기 때문에 변수를 설명했다. 건배.

+1

SET @Query = 'SELECT COUNT (*) FROM '+ OBJECT_NAME (@ my_object_id) +'; ''? 중간 '@ Name' 변수가 당신을 사는 이유는 무엇입니까? 또한 스키마가'dbo' (또는 현재 사용자의 기본 스키마)가 아닌 경우에는 어떻게해야합니까? 이 경우에는'OBJECT_SCHEMA_NAME'을 포함하는 것이 유용합니다. 마지막으로, '내 테이블'또는 '내 테이블'과 같이 테이블의 이름이 잘못 선택되면 어떻게 될까요? 'QUOTENAME'을 사용하여 객체에 대한 참조를 묶을 때 유용합니다. –

+0

순수한 SQL에 의해 자체 포함 의미; 어떤 외부 스크립팅 엔진을 필요로하지 않습니다 :-) - 동적으로 생성 된 SQL은 안전합니다. –

+0

@AaronBertrand'@ Name' 변수는 아무 것도 의미하지 않습니다. 여기서 핵심은 쿼리 가능성을 보여주는 것입니다. – Oybek

관련 문제