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

发布于 2024-08-09 16:46:33 字数 559 浏览 3 评论 0原文

我想了解 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')

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

I want to know status of every database across a SQL Server farm. I was using:

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

But a friend told me that Status could be combination of 2 e.g. 32+128 = 32128.
How can I find database status using this figure?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

离去的眼神 2024-08-16 16:46:33

状态号由状态字段值的“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')

请参阅 sqlserver 中 sysdatabases 的不同状态位 用于检查特定值的示例脚本。

编辑:
MSDN 库有这个 说明 sysdatabases 的 status 和 status2 字段中各个位的值

The status number is made up of the "on" bits of the status field value. So, status can be a combination of 2 states (eg 32 + 128) but you can get the individual states by checking the values of specific bits in the status value.

You could do something like this:

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

See different status bits of sysdatabases in sqlserver for an example script that checks for specific values.

EDIT:
MSDN library has this to say about the values of the various bits in the status and status2 fields of sysdatabases

友欢 2024-08-16 16:46:33

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

512 十进制 = 200 十六进制 = 0010 0000 0000 二进制

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

二进制是按位与运算符。逻辑表为:

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

如您所见,如果将两个位进行 AND 运算,则两个位都必须为 1
结果为 1。AND ( & ) 运算符用于屏蔽所有其他位
确定是否设置了特定位。

因此,如果将状态值与 512 相与,则如果该位是,结果将为 512
放。否则,它将为零。

由于 512 是第 10 位(从右到左计数),因此 status &第512章
状态值中的位为 0100 0000 0000。如果状态值中的第 10 位为 1
status 值,结果将为 1,表示开启 OFFLINE 选项
开(设置)。

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

曼乔特
这将帮助您开始:

  1. 您需要创建一个将 varbinary 转换为十六进制字符串的存储过程 - 请参阅 Microsoft 的 INFO:将二进制数据转换为十六进制字符串
  2. 以下sql:

    SELECT sus.status,
           sus.stat,
           PATINDEX('%8', sus.stat) > 时的情况0 THEN 1 ELSE NULL END '截断。登录 chkpt;使用 sp_dboption 设置。',
           CASE WHEN PATINDEX('%1%', sus.stat) = 9 THEN 1 ELSE NULL END '撕裂页面检测,使用 sp_dboption 设置。',
           CASE WHEN PATINDEX('%1%', sus.stat) = 8 THEN 1 ELSE NULL END '正在加载。',
           CASE WHEN PATINDEX('%1%', sus.stat) = 7 THEN 1 ELSE NULL END '恢复前'。
      FROM (SELECT t.status,
                   sp_hexadecimal(CONVERT(varbinary(8), t.status)) 'stat'
              来自系统数据库 t) su
    

All of the status numbers are shown in base 10 (decimal, our usual numbering system).
However, you will note that all of the numbers are a multiple of 2 because
they represent a bit position (base 2, 0 or 1).

512 decimal = 200 hex = 0010 0000 0000 binary

1024 decimal = 400 hex = 0100 0000 0000 binary

The & is the bitwise AND operator. The logic table is:

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

As you can see, if you AND two bits together, both bits must be 1 for the
result to be 1. The AND ( & ) operator is used to mask all of the other bits to
determine whether or not a particular bit is set.

So, if you AND the status value with 512, then result will be 512 if the bit is
set. Otherwise, it will be zero.

Since 512 is the 10th bit (counting right to left), status & 512 will AND all of
the bits in the status value with 0100 0000 0000. If the 10th bit is a 1 in the
status value, the result will be 1, indicating that the OFFLINE option is turned
on (set).

To use the status columns effectively, you need at a least a rudimentary
knowledge of binary and hexidecimal number systems. Actually, the same
principles apply of any base (you just a way to represent each digit for large
bases).

Manjot
This will get you started:

  1. You need to create a sproc that will convert varbinary into a hexstring - see Microsoft's INFO: Converting Binary Data into Hexadecimal String
  2. The following 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
    
御守 2024-08-16 16:46:33

这是一个旧线程,所以也许这个答案有点晚了,但您也可以使用 sys.databases 表,该表将所有位分解为列。

This is an old thread so perhaps this answer is a bit late, but you can also use sys.databases table which has all the bits broken out into columns.

想念有你 2024-08-16 16:46:33

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

SELECT name, state_desc DatabaseStatus_sysDatabase FROM sys.databases

For Sql server 2005 or better you can use

SELECT name, state_desc DatabaseStatus_sysDatabase FROM sys.databases
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文