Sql-Server
查詢表中的每個數據庫
我們進行了設置,以便將在伺服器掃描期間顯示錯誤程式碼的任何數據庫設置為將數據庫名稱寫入表中。然後我想做的是生成一封電子郵件,該電子郵件將發送引發錯誤程式碼的數據庫。
我一直在玩弄這種語法;但是,它不會執行,我不斷得到:
消息 422,級別 16,狀態 4,行 9
已定義但未使用的公用表表達式。
這是我的語法——我最好的方法是什麼?
- 掃描表格
[dbo].[FailingDatabase]
並從兩個欄位中獲取值datefaield, database
- 執行 Select 語句以生成失敗數據庫的結果集
- 生成一封電子郵件(我可以做這個元素,這部分沒有問題)
這是我的表FailingDatabase的 DDL :
Create Table [dbo].[FailingDatabase] ( datefailed datetime ,[database] varchar(1000) ) Insert INTO [dbo].[FailingDatabase] VALUES ('2016-03-18 08:29:00.000', 'server.database.dbo.tablename') ,('2016-03-18 08:35:00.000', 'server.database.dbo.tablename')
我正在嘗試使用 CTE 來查詢數據庫,因為如果我可以查詢數據庫,我會在電子郵件中設置一個標誌。如果查詢成功,那麼我知道數據庫仍在執行。如果我無法查詢數據庫,那麼無論出於何種原因,它都處於離線狀態,我需要立即嘗試補救。
這是我不工作的語法…
declare @fullsyntax varchar(MAX) ;with faileddb as ( Select Top 2 [databasename] FROM [dbo].[FailingDatabase] ) select @fullsyntax += 'Select datefaield, database FROM ' + [databasename] + 'from faileddb; ' Print @fullsyntax
我還可以添加一個 where 子句,例如:
FROM '+[databasename]+' WHERE databasename <> ''Master'';' from faileddb;
您的動態 SQL 有錯誤。嘗試這個:
IF COALESCE(OBJECT_ID('dbo.FailingDatabase'), 0) = 0 Create Table [dbo].[FailingDatabase] ( DateFailed datetime , DatabaseName varchar(1000) ); TRUNCATE TABLE dbo.FailingDatabase; Insert INTO [dbo].[FailingDatabase] (DateFailed, DatabaseName) VALUES ('2016-03-18 08:29:00.000', 'server.database1.dbo.tablename') , ('2016-03-18 08:35:00.000', 'server.database2.dbo.tablename'); DECLARE @fullsyntax VARCHAR(MAX); SET @fullsyntax = ''; ;WITH faileddb AS ( SELECT TOP (2) databasename --why you want TOP(2) is unclear FROM dbo.FailingDatabase ) SELECT @fullsyntax = @fullsyntax + CASE WHEN @fullsyntax = '' THEN '' ELSE CHAR(13) + CHAR(10) END + 'SELECT datefaield, database FROM ' + [databasename] + ';' FROM faileddb WHERE faileddb.DatabaseName NOT IN ( 'master' , 'tempdb' ); PRINT (@fullsyntax);