SQL 服务器 - 如果数据库处于 RESTORING 状态,则跳过查询该数据库

SQL Server - Skip querying a database if it is in RESTORING state

我有这个在网上找到的脚本并且已经适应了我的数据库实例。它所做的是查看实例中所有 SQL 服务器数据库中是否存在特定的 table。如果找到 table 并且不为空,那么它将列出找到 table 的数据库的名称。到目前为止一切都很好,但是,如果数据库处于正在恢复状态,那么我的脚本就会卡在该数据库中。我在 'Where' 子句中尝试了不同的选项,例如 STATE = 0 (在线)或 state_desc != 'RESTORING' 但它仍然失败。正在恢复状态的数据库在这里不是问题,因为有时有人可能真的在尝试恢复。如果数据库不在线,我只想不查询该数据库。我想以某种方式利用 SELECT DATABASEPROPERTYEX ('DatabaseName', 'Status') 但不知道如何使用。我不是 T-SQL 大师,所以真的希望有人可以调整此查询以跳过正在恢复状态的数据库。非常感谢,谢谢..

SET NOCOUNT ON;  
IF OBJECT_ID (N'tempdb.dbo.#temptbl') IS NOT NULL DROP TABLE #temptbl  
CREATE TABLE #temptbl ([COUNT] INT , SiteDBName VARCHAR(50) ) 
DECLARE @TableName NVARCHAR(50)  
SELECT @TableName = '[dbo].[PRJMGTLocation]'  
DECLARE @SQL NVARCHAR(MAX)  
SELECT @SQL = STUFF( 
        (     SELECT CHAR(13) + 'SELECT ''' + name + ''', COUNT(1) FROM [' + name + '].' + @TableName    
        FROM sys.databases     
        WHERE OBJECT_ID(name + '.' + @TableName) IS NOT NULL   
        --  and STATE = 0 and state_desc != 'RESTORING'   
        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')  

INSERT INTO #temptbl (SiteDBName, [COUNT])              

EXEC sys.sp_executesql @SQL  

SELECT * FROM #temptbl t where COUNT >=1 ORDER BY SiteDBName asc

你能试试下面的小调整吗:

select SQL = Stuff( 
    (select Char(13) + 'SELECT ''' + name + ''', COUNT(1) FROM ' + QuoteName(name) + '.' + @TableName    
    from (select top(1000) name from sys.databases  where state=0   )d
    where Object_Id(d.name + '.' + @TableName) is not null   
    for xml path(''), type).value('.', 'NVARCHAR(MAX)'), 1, 1, '')  
 

问题是在 object_id() 查找之后,使用 row-goal 在 中过滤掉行sub-query 可以强制 SQL 服务器反向执行。