tsql以单词查找数据库的状态

时间:2009-11-03 03:08:25

标签: sql sql-server tsql sql-server-2000

我想了解SQL Server服务器场中每个数据库的状态。我正在使用:

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')

但是一位朋友告诉我,状态可能是2的结合,例如32 + 128 = 32128。 如何使用此图找到数据库状态?

4 个答案:

答案 0 :(得分: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库有this来说明sysdatabases状态和status2字段中各个位的值

答案 1 :(得分:2)

所有状态编号都显示在基数10(十进制,我们常用的编号系统)中。 但是,您会注意到所有数字都是2的倍数,因为 它们代表一个位置(基数为2,0或1)。

512 decimal = 200 hex = 0010 0000 0000 binary

1024十进制= 400十六进制= 0100 0000 0000二进制

&是按位AND运算符。逻辑表是:

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

正如您所看到的,如果您和两位一起使用,则两个位必须为1 结果为1. AND(&)运算符用于屏蔽所有其他位 确定是否设置了特定位。

因此,如果您将状态值与512进行比较,那么如果该位为,则结果为512 组。否则,它将为零。

由于512是第10位(从右向左计数),因此状态& 512将AND和所有 状态值中的位为0100 0000 0000.如果第10位是1中的1 状态值,结果将为1,表示已关闭OFFLINE选项 on(set)。

要有效地使用状态列,您至少需要一个基本的 二元和十六进制数系统的知识。实际上,同样的 原则适用于任何基础(你只是一种表示大数字的方法) 碱基)。

<强> Manjot
这将帮助您入门:

  1. 您需要创建一个将varbinary转换为hexstring的sproc - 请参阅Microsoft的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
    

答案 2 :(得分:0)

这是一个旧线程,所以也许这个答案有点晚了,但你也可以使用sys.databases表,它将所有的位分成列。

答案 3 :(得分:0)

对于Sql server 2005或更高版本,您可以使用

SELECT name, state_desc DatabaseStatus_sysDatabase FROM sys.databases