我有這個腳本,我在網上找到并適應了我的資料庫實體。它的作用是查看實體內的所有 SQL Server 資料庫中是否存在特定表。如果找到該表并且如果不是空的,那么它將列出找到該表的資料庫的名稱。到目前為止一切都很好,但是如果資料庫處于恢復狀態,那么我的腳本就會卡在該資料庫中。我在“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
uj5u.com熱心網友回復:
您可以嘗試以下微調:
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, '')
問題是從 sys.databases 中過濾掉行是在查找之后發生的object_id(),在子查詢中使用行目標可以強制 SQL Server 反向執行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/432833.html
下一篇:SQLServer-示例時間序列
