2009-11-03 2 views
1

SQL Server 팜에서 모든 데이터베이스의 상태를 알고 싶습니다. 나는 다음을 사용했다 :tsql을 사용하여 데이터베이스의 상태를 단어로 찾을 수 있습니다.

select name, 
     case status 
     when 32 then 'loading' 
     when 128 then 'recovering' 
     when 512 then 'offline' 
     when 4096 then 'single user' 
     when 64 then 'pre recovery' 
     when 256 then 'not recovered' 
     else 'Normal' 
     end 
from sysdatabases 
where name not in('master','msdb','model','tempdb','reportserver','reportservertempdb','pubs','distribution','northwind') 

그러나 친구는 Status가 2와 같이 조합 될 수 있다고 말했다. 32 + 128 = 32128. 이 그림을 사용하여 데이터베이스 상태를 어떻게 찾을 수 있습니까?

답변

2

모든 상태 번호의 상태와 STATUS2 분야에서 다양한 비트의 값에 대해 할 말이 this을했다, 우리의 일반적인 번호 체계). 그러나 은 비트 위치 (기본 2, 0 또는 1)를 나타 내기 때문에 모든 숫자가 2의 배수임을 알 수 있습니다.

진수 512 = 200 = 헥스 0000 0000 0010

&

이진수 0000 0000 0100는 비트 AND 연산자이다 = 이진

1,024 진수 = 400 헥스. 논리 표이다 : 보시 함께 사용자와 두 비트 경우 결과 1. AND되기를

A B A AND B 
0 0  0 
1 0  0 
0 1  0 
1 1  1 

, 두 비트가 1이어야 (&) 연산자는 모두 마스크 사용 다른 비트를 으로 지정하면 특정 비트가 설정되는지 여부가 결정됩니다.

그래서 상태 값을 512와 AND하면 비트가 으로 설정되면 결과는 512가됩니다. 그렇지 않으면 0이됩니다.

512 (오른쪽에서 왼쪽으로 카운트)가 10 비트이기 때문에, 상태 & 512 것이고, 10 비트는 상태 값이 1이면 0100 0000 0000과 상태 값의 비트 의 전부 결과는 OFFLINE 옵션이 켜짐 (설정) 으로 설정되었음을 나타내는 1이됩니다.

상태 열을 효과적으로 사용하려면 최소한 의 이진 및 16 진수 시스템에 대한 지식이 필요합니다. 실제로 동일한 원칙은 모든 기본 항목을 적용합니다 (큰 기준에 대해 각 자릿수를 나타낼 수있는 방법 일뿐입니다).

Manjot
이것은 당신이 시작하는 것입니다 :

  1. 당신이 hexstring로 VARBINARY로 변환하는 SPROC을 만들어야합니다 - 마이크로 소프트의 INFO: Converting Binary Data into Hexadecimal String
  2. 다음과 같은 SQL 참조하십시오

    SELECT sus.status, 
         sus.stat, 
         CASE WHEN PATINDEX('%8', sus.stat) > 0 THEN 1 ELSE NULL END 'trunc. log on chkpt; set with sp_dboption.', 
         CASE WHEN PATINDEX('%1%', sus.stat) = 9 THEN 1 ELSE NULL END 'torn page detection, set with sp_dboption.', 
         CASE WHEN PATINDEX('%1%', sus.stat) = 8 THEN 1 ELSE NULL END 'loading.', 
         CASE WHEN PATINDEX('%1%', sus.stat) = 7 THEN 1 ELSE NULL END 'pre recovery.' 
        FROM (SELECT t.status, 
           sp_hexadecimal(CONVERT(varbinary(8), t.status)) 'stat' 
          FROM SYSDATABASES t) sus 
    
+0

직접 적용 할 수있는 TSQL이 있습니까? – Manjot

6

상태 번호는 상태 필드 값의 "on"비트로 구성됩니다. 따라서 상태는 2 개 상태 (예 : 32 + 128)의 조합 일 수 있지만 상태 값의 특정 비트 값을 확인하여 개별 상태를 얻을 수 있습니다.

은 당신이 뭔가를 할 수 있습니다 :

SELECT 
CASE (status & 32) WHEN 32 THEN 'loading' ELSE '' END + ' ' + 
CASE (status & 128) WHEN 128 THEN 'recovering' ELSE '' END as status 
FROM sysdatabases 
WHERE NAME NOT IN ('master','msdb','model','tempdb','reportserver','reportservertempdb','datacomsqlaudit','pubs','distribution','northwind') 

가 특정 값을 확인하는 예제 스크립트에 대한 different status bits of sysdatabases in sqlserver를 참조하십시오.

편집

: MSDN 라이브러리가 기본 10 (십진수로 표시됩니다 SYSDATABASES

+0

감사를 사용할 수 있습니다. 대기 상태에 해당하는 비트가 있습니까? – Manjot

+0

사실 내 친구는 혼란스럽지 않았습니다. 내가 제대로 설명하지 못했습니다. – Manjot

+0

아니요, 분명히 "대기"비트가 없습니다 – kristian

0

이것은 오래된 스레드이므로 아마도이 답변은 조금 늦었 겠지만 모든 비트가 열로 구분 된 sys.databases 테이블을 사용할 수도 있습니다.

0
SQL 서버 2005에 대한

또는 더 나은 당신은

SELECT name, state_desc DatabaseStatus_sysDatabase FROM sys.databases 
관련 문제